关于C++从属名称

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值