在《EFFECTIVE C++ 3.0》的第41条款提到:
在使用从属嵌套类型名称是需要使用typename来修饰,因为类属模板的实现是“编译时”的,若下状况
void print(const T& con)
{
if(con.size() >= 2)
{
T::const_iterator iter(con.begin());
++iter;
int value = *iter;
std::cout<<value<<endl;
}
}
编译器无法知道T::const_iterator到底是T里的成员呢,还是像我们一样,能把他当做一种类型来看待,因此编译器就无法匹配出对应的代码,从而编译错误
不过我分别使用了G++和VC编译,发现VC是可以通过的!!
而G++过不了,报错的内容也是:T::const_iterator需要加个";"
从而我们可以看出编译器确实把T::const_iterator当做一个成员了
还有vector<vector<int>> vec;在G++也是编译不过的,因为编译器突然看到">>"这个右移运算符,觉得莫名奇妙
不过VC还是编译过了,说明VC编译器确实一分钱一分货啊~~~体积庞大,也有它设计的独到之处。
不过这个就难为程序员了,当移植代码时,G++是读不出的,所以建议VC程序员还是符合标准吧,在T::const_iterator前添加typename给编译器标示一下,<int>后加个空格