2013-02-18 84 views
0

有没有办法在VS中识别缺少的类型名称? VS是否至少会产生某种警告?如何在Visual Studio中识别缺少的类型名称

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) 
} 
+2

“因为没有typename,代码可能无法与另一个编译器编译”=>“,因为没有typename代码没有很好地形成C++”。 – juanchopanza 2013-02-18 15:56:18

+0

我们在谈论什么版本的VS? – fredoverflow 2013-02-18 16:00:43

+4

@FredOverflow这是如何重复的?这个问题并不是问关键词是什么或者它们在哪里应用,而是如何让MSVC从它的唯一性位置下台,至少在接受非标准语法时提及*。 – Angew 2013-02-18 16:04:18

回答

1

我不确定它是否具有100%的标准一致性,但对于明确需要typename的所有或大多数情况,MSVC会生成Compiler Warning (level 1) C4346。所以只要你用编译器标记/W1或更高编译你应该没问题。

+0

这很奇怪。我正在使用\ W3,但是在VS10中没有收到任何警告。 – user2083875 2013-02-18 20:18:32

1

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

auto it = dum_vector.begin(); 

你就完成了。

请注意,自MSVC10以来,支持auto,所以如果您使用它,我建议您使用auto代替blah::blah::iterator。如果您使用的是旧版本,最好尽可能升级并充分利用C++ 11功能的优势。如果你不能这样做,那么它是非常不可能 MSVS可以告诉你缺少的类型名称,因为编译器首先编译非标准代码!

+1

谢谢,虽然我非常感谢C++ 11中的auto,但是当前的项目我的工作还没有切换到C++ 11兼容编译器。 – user2083875 2013-02-18 16:11:17

+0

另外感谢您的补充说明,我也同意这一点。如果对我的问题没有其他答案,我会接受你的答案(因为你试图解释为什么不提供这种支持)。 – user2083875 2013-02-18 16:27:42