C++ 在类外调用常量迭代器时出现问题
我有一个名为C++ 在类外调用常量迭代器时出现问题,c++,templates,generics,vector,iterator,C++,Templates,Generics,Vector,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);
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();
};
使用名称空间std;
模板
类Nuage{
私人:
向量v;
静态向量::常量迭代器it;
公众:
Nuage();
无效(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::Nuage(){}
模板
void Nuage::ajouter(tp){
v、 推回(p);
}
模板
int Nuage::size(){
返回v.size();
}
模板
T&Nuage::begin(){
返回v.begin();
}
模板
Nuage::~Nuage(){}
当我试图从一个单独的文件测试该类的功能时,以下代码行有两个错误:
下面这行代码来自一个我无法更改的单元测试,因此我的代码应该适应它。
Nuage::const_迭代器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()) );
}
TEST_CASE(“TP2_Nuage::iterators”){
Polaire p1(12,34);
Polaire p2(56,78);
Polaire p3(90,12);
波兰雷p4(34,56);
Nuagen;
n、 ajouter(p1);
n、 ajouter(p2);
n、 ajouter(p3);
n、 ajouter(p4);
Polaire t[4];
无符号i=0;
Nuage::const_迭代器it=n.begin();
而(it!=n.end())t[i++]=*(it++);
REQUIRE(t[0].getAngle()==近似值(p1.getAngle());
REQUIRE(t[0].getDistance()==近似值(p1.getDistance());
REQUIRE(t[1].getAngle()==近似值(p2.getAngle());
REQUIRE(t[1].getDistance()==近似值(p2.getDistance());
REQUIRE(t[2].getAngle()==近似值(p3.getAngle());
REQUIRE(t[2].getDistance()==近似值(p3.getDistance());
REQUIRE(t[3].getAngle()==近似值(p4.getAngle());
REQUIRE(t[3].getDistance()==近似值(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()
错误:“std::vector::const_迭代器”之前需要“typename”,因为“std::vector”是一个从属作用域
错误:“常量迭代器”不是“Nuage”的成员
Nuage::const_迭代器it=n.begin()
看起来您正试图用Nuage::begin()
之类的东西公开底层向量的迭代器。如果是这种情况,我建议public
使用
声明,并确保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();
};
模板
类Nuage{
私人:
std::向量v;
公众:
使用iterator=typename std::vector::iterator;
使用const_迭代器=typename std::vector::const_迭代器;
Nuage();
无效(T);
int size();
迭代器begin();
常量迭代器begin()常量;
迭代器end();
常量迭代器end()常量;
~Nuage();
};
这里,我使用的声明意味着Nuage::iterator
与std::vector::iterator
的类型相同,begin
函数返回一个
我还对您的代码做了一些其他更改。我使用名称空间std删除了代码>来自头文件,因为这是。我还添加了一个const
版本的begin()
,使其与std::vector
接口更加匹配。最后,我添加了Nuage::end
函数的声明,这肯定是单元测试所需要的代码>。请同时显示剩余的代码。您能否描述行static vector::const_iterator it的预期用途和用例代码>?我不清楚该类型的静态成员变量会有什么用途,并怀疑您可能打算改为执行typedef。@cigien Nuage::const_iterator It=n.begin();这是单元测试的一部分,我不能更改,这意味着我的代码应该适应它。我不是说你应该更改它,但我们确实需要查看该代码。@cigien好的,我会把它放进去