MSVC:无法识别的模板声明/定义(与Clang / GCC编译)

时间:2017-11-08 10:25:51

标签: c++ visual-c++ language-lawyer

我尝试构建一个在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.hmain不是实际库代码的一部分,但已添加到允许在VS Windows命令行项目中使用它。

我在这里想念什么? MSVC在模板中是否存在成员类或朋友声明的问题?

1 个答案:

答案 0 :(得分:2)

VC ++的问题在于typename没有限定参数类型。 [temp.res]/7

  

[...]定义中   关键字是 declarator-id 之后的类模板的成员   在引用之前的名称时不需要typename   声明类型或类的类模板的声明成员   模板。

declarator-id 声明的第一个组件,因此参数子句中的任何成员类型都不需要以typename作为前缀。