1

无论如何要识别 VS 中缺少的类型名吗?VS 至少会产生某种警告吗?

template<class T> 
void dum() {
  std::vector<T> dum_vector;
  typename std::vector<T>::iterator it = dum_vector.begin(); 
  // VS compiles it with or without typename, but I would like to know whether 
  // I forgot to put a typename, since without typename the code may not compile 
  // with another compiler (e.g. GCC)
}
4

2 回答 2

1

我不确定它是否 100% 符合标准,但 MSVC 会为所有或大多数明确需要的情况生成编译器警告(级别 1)C4346 。typename因此,只要您使用编译器标志/W1或更高版本进行编译,就应该没问题。

于 2013-02-18T16:44:30.510 回答
1

实际上在当前版本的 C++(即 C++11)中,你不需要写那么多。你可以这样写:

auto it = dum_vector.begin(); 

你就完成了。

请注意,auto从 MSVC10 开始支持,因此如果您正在使用它,我建议您使用auto. blah::blah::iterator如果您使用的是旧版本,最好升级并尽可能利用 C++11 功能的优势。如果你不能这样做,那么MSVS 就不太可能告诉你缺少的类型名,因为编译器首先编译了非标准代码!

于 2013-02-18T16:02:25.957 回答