【发布时间】:2018-04-22 20:57:14
【问题描述】:
在一些遗留代码中,我看到以下内容:
class myClass : public CObject
{
DECLARE_DYNAMIC(myClass)
public:
void myClassMethod() const;
....
}
std::vector<const myClass*> vMyClass;
...
for (const myClass *const* Q = vMyClass.begin(); Q != vMyClass.end(); Q++)
(*Q)->myClassMethod();
我不明白 const 在这里做什么。 (无论是在这个论坛还是在谷歌中,我都无法搜索到它,星号会被去掉,所以搜索解释是没有用的。)
我所知道的是,这段代码通常假设 vector.begin() 返回一个指针而不是迭代器。所以我尝试将for循环重写为:
std::vector<myClass*>::iterator Q;
for (Q = vMyClass.begin(); Q != vMyClass.end(); Q++)
(*Q)->myClassMethod();
但我从 Visual Studio 2003 C++ 编译器收到以下错误:
error C2678: binary '!=' : no operator found which take a left-hand 'std::vector<_ty>::iterator' 类型的操作数(或者没有 可接受的转换)与 [ _Ty=myClass * ]
我不明白这里出了什么问题...在我的另一部分代码中:
std::vector<myOtherClass> vMyOtherClass;
...
std::vector<myOtherClass>::iterator Z;
for (Z = vMyOtherClass.begin(); Z != vMyOtherClass.end(); ++Z)
...
这编译干净。任何想法为什么我会在 vMyClass 循环上收到错误或如何处理它?知道 const 在做什么吗?
新信息
最初,我错误地复制了矢量定义。现在它已经修复(上图),我看到迭代器缺少一个 const。它应该是:
std::vector<const myClass*>::iterator Q;
但是当我在我的代码中进行此修复时,错误消息从对 vector.end() 的调用切换到 vector.begin():
错误 C2679:二进制“=”:未找到采用右手的运算符 'std::vector<_ty>::const_iterator' 类型的操作数(或者没有 可接受的转换)与 [ _Ty=const myClass * ]
我不明白vector.end() 和operator != 是如何工作的,但是vector.begin() 和operator =... 是错误的?
【问题讨论】:
-
您似乎需要改用
const_iterator,但最好使用auto -
@Slava in VS 2003 auto 不会编译。
-
@manni66 不知道,谢谢
-
VS 2003 已经过时了。考虑使用 VS 2017!
-
@manni66,你基本上是正确的。实际上自动编译,但它被解释为 int。所以它真的不起作用。请参阅下面关于我们选择 VS 2003 的评论。