如何解决在外部类中调用const_iterator的问题
我在实现上有一个名为Nuage
的类:
nuage.hpp
using namespace std;
template <typename T>
class Nuage {
private:
vector<T> v;
static vector<T>::const_iterator it;
public:
Nuage();
void ajouter(T);
int size();
T& begin();
~Nuage();
};
nuage .cpp
template <typename T>
Nuage<T>::Nuage(){}
template <typename T>
void Nuage<T>::ajouter(T p) {
v.push_back(p);
}
template <typename T>
int Nuage<T>::size() {
return v.size();
}
template <typename T>
T& Nuage<T>::begin(){
return v.begin();
}
template <typename T>
Nuage<T>::~Nuage(){}
当我尝试从单独的文件中测试类的功能时,下面的代码行出现两个错误: 下一行来自我无法更改的单元测试,因此我的代码应该适应它。 Nuage :: const_iterator it = n.begin();
单元测试代码为:
TEST_CASE ( "TP2_Nuage::Iterateurs" ) {
Polaire p1(12,34);
Polaire p2(56,78);
Polaire p3(90,12);
Polaire p4(34,56);
Nuage<Polaire> n;
n.ajouter(p1);
n.ajouter(p2);
n.ajouter(p3);
n.ajouter(p4);
Polaire t[4];
unsigned i = 0;
Nuage<Polaire>::const_iterator it = n.begin();
while (it!=n.end()) t[i++]=*(it++);
REQUIRE ( t[0].getAngle() == Approx(p1.getAngle()) );
REQUIRE ( t[0].getDistance() == Approx(p1.getDistance()) );
REQUIRE ( t[1].getAngle() == Approx(p2.getAngle()) );
REQUIRE ( t[1].getDistance() == Approx(p2.getDistance()) );
REQUIRE ( t[2].getAngle() == Approx(p3.getAngle()) );
REQUIRE ( t[2].getDistance() == Approx(p3.getDistance()) );
REQUIRE ( t[3].getAngle() == Approx(p4.getAngle()) );
REQUIRE ( t[3].getDistance() == Approx(p4.getDistance()) );
}
错误是:
error: need ‘typename’ before ‘std::vector<T>::const_iterator’ because ‘std::vector<T>’ is a dependent scope
error: ‘const_iterator’ is not a member of ‘Nuage<Polaire>’
Nuage<Polaire>::const_iterator it = n.begin()
解决方法
您似乎正在尝试使用vector
之类的东西来公开基础Nuage<T>::begin()
的迭代器。如果是这种情况,我建议使用public
using
声明,并确保begin
具有适当的返回类型:
template <typename T>
class Nuage {
private:
std::vector<T> v;
public:
using iterator = typename std::vector<T>::iterator;
using const_iterator = typename std::vector<T>::const_iterator;
Nuage();
void ajouter(T);
int size();
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
~Nuage();
};
在这里,我的using
声明意味着Nuage<T>::iterator
与std::vector<T>::iterator
的类型相同,并且begin
函数返回一个。
我还对您的代码进行了其他一些更改。我从头文件中删除了using namespace std;
,因为它是pretty frowned-on behavior。我还添加了const
的{{1}}版本,以使其与begin()
界面更加匹配。最后,我添加了std::vector
函数的声明,该单元测试肯定需要这些函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。