我尝试构建一个在OSX(clang)和Linux(GCC / Clang)上编译得很好的库。我偶然发现了MSVC / Visual Studio 2017无法理解的模板定义。我可以把它归结为:
#include "stdafx.h"
template<class T>
class Parent {
class Child {
friend class Parent;
public:
Child(const Child &r);
};
};
template<class T>
Parent<T>::Child::Child(const Parent<T>::Child &r) {
*this = r;
}
int main(int argc, char const *argv[]) {
/* code */
return 0;
}
这(仍)导致以下错误:
1>...consoleapplication1.cpp(13): error C2988: unrecognizable template declaration/definition
1>...consoleapplication1.cpp(13): error C2059: syntax error: '('
1>...consoleapplication1.cpp(13): error C2143: syntax error: missing ';' before '{'
1>...consoleapplication1.cpp(13): error C2447: '{': missing function header (old-style formal list?)
但是(仍然)使用Clang或GCC在OSX上编译。 stdafx.h
和main
不是实际库代码的一部分,但已添加到允许在VS Windows命令行项目中使用它。
我在这里想念什么? MSVC在模板中是否存在成员类或朋友声明的问题?
答案 0 :(得分:2)
VC ++的问题在于typename
没有限定参数类型。 [temp.res]/7:
[...]定义中 关键字是 declarator-id 之后的类模板的成员 在引用之前的名称时不需要
typename
声明类型或类的类模板的声明成员 模板。
declarator-id 是声明的第一个组件,因此参数子句中的任何成员类型都不需要以typename
作为前缀。