首页 > 解决方案 > 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()

标签: c++templatesgenericsvectoriterator

解决方案


看起来您正在尝试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;我从头文件中删除了,因为那是非常令人不快的行为。我还添加了一个const版本,begin()使其与std::vector界面更加匹配。最后,我添加了Nuage::end函数声明,单元测试肯定需要这些声明。


推荐阅读