Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在类外调用常量迭代器时出现问题_C++_Templates_Generics_Vector_Iterator - Fatal编程技术网

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好的,我会把它放进去