关于C++从属名称

来源:互联网 发布:c语言转义字符有哪些 编辑:程序博客网 时间:2024/05/18 01:30

在《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>后加个空格

原创粉丝点击