任何人都可以建议为什么这不编译?我想我错过了一些重要的东西。编译器是g ++ 4.2.1(在OS X上),错误是“预期的`;”在'it'之前,在声明迭代器的行上。
#include <vector>
template <class T>
class A {
public:
struct SomeStruct {
T* ptr;
int i;
};
typedef std::vector<SomeStruct> MyList;
void Func()
{
MyList::iterator it;
}
};
答案 0 :(得分:6)
变化:
MyList::iterator it;
为:
typename MyList::iterator it;
我认为这与编译器无法确定MyList::iterator
是否应该是某种值(例如iterator
是MyList
的静态成员)或一种。 typename
强制后者(正确)选项。
我相信相关的标准报价从这里开始,第二个14.6:
假定模板中使用的名称不是为类型命名,除非适用的名称查找找到类型名称或名称由关键字
typename
限定。
所以,你必须弄清楚“适用的名称查找”是什么,但标准也跟着这个例子:
// no B declared here
class X;
template<class T> class Y {
class Z; // forward declaration of member class
void f() {
X* a1; // declare pointer to X
T* a2; // declare pointer to T
Y* a3; // declare pointer to Y<T>
Z* a4; // declare pointer to Z
typedef typename T::A TA;
TA* a5; // declare pointer to T’s A
typename T::A* a6; // declare pointer to T’s A
T::A* a7; // T::A is not a type name:
// multiply T::A by a7
B* a8; // B is not a type name:
// multiply B by a8; ill-formed,
// no visible declaration of B
}
};
答案 1 :(得分:4)
你缺少typename
:
#include <vector>
template <class T>
class A {
public:
struct SomeStruct {
T* ptr;
int i;
};
typedef std::vector<SomeStruct> MyList;
void Func()
{
typename MyList::iterator it;
}
};
int main() {}
此代码使用g ++,msvc和Comeau Online编译。
技术上SomeStruct
是依赖名称,这意味着SomeStruct
代表的内容取决于模板参数。从编译器的角度来看,std::vector
可能专门用于某些A<T>::SomeStruct
,其中该专门化没有iterator
typedef。所以你必须告诉糟糕的编译器。 ; - )
干杯&amp;第h。,