c++ - 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;
我从头文件中删除了,因为那是非常令人不快的行为。我还添加了一个const
版本,begin()
使其与std::vector
界面更加匹配。最后,我添加了Nuage::end
函数声明,单元测试肯定需要这些声明。
推荐阅读
- apache - PDF 无法在 Web 浏览器上正确打开远程文件夹中的文件
- python - 索引不在范围内,在序列数据上运行 LSTM 模型
- mysql - 在 Golang 网站中使用模板显示 mysql 表
- python - 尝试将颜色渐变添加到 Matplotlib 图表
- angular - 什么可能导致在 AOT 构建中而不是在开发环境中发生的带有对象原型的 Uncaught TypeError?
- r - 使用局部变量更新函数
- android - Android使用相机意图并在本地保存图像
- java - 为 Android (Java) 实施 Google 保存的游戏
- java - 读取unicode字符代码JAVA
- python - Url 以 UTF-8 编码,但 Python 试图将其读取为 cp1256