18

我在使用 Visual Stuido 2010 SP1、cl.exe 版本 16.0.40219.1 编译一些模板代码时遇到了问题

以下代码将导致编译器访问冲突:

template<typename T>
class A
{
    A(){}
};

template<typename T>
class B : public A<T>
{
    using A::A(); // Compiler access violates
    // **EDIT**
    //using A<T>::A<T>; // Compiler succeeds
    //using A<T>::A(); // Compiler reports error
};

int main(int argc, char* argv[])
{
    return 0;
}

它会生成以下错误(除了“cl.exe 已停止工作,C0000005 异常):

1>d:\projects\cpptest\cpptest\cpptest.cpp(11): fatal error C1001: An internal error has occurred in the compiler.
1>  (compiler file 'msc1.cpp', line 1420)
1>   To work around this problem, try simplifying or changing the program near the locations listed above.

代码在带有 g++ 的 Dev-C++ 中编译得很好(嗯,也就是说,它会发出正确的错误消息并且不会使编译器崩溃)。

main.cpp:11: error: `template<class T> class A' used without template parameters
main.cpp:11: error: expected nested-name-specifier before "A"
main.cpp:11: error: using-declaration for non-member at class scope
main.cpp:11: error: expected `;' before '(' token
main.cpp:11: error: expected unqualified-id before ')' token
make.exe: *** [main.o] Error 1

编辑 然而,下面的编译很好,没有访问冲突,所以这似乎与模板有关:

class A
{
    A(){}
};

class B : public A
{
    using A::A;
};

int main(int argc, char* argv[])
{
    return 0;
}

您认为这值得向 Microsoft 报告吗?其他人可以重现这个吗?也许尝试在 Visual Studio 2013 中查看它是否仍然存在?

4

2 回答 2

4

由于其他人可以在 Visual C++ 平台上重现这一点,因此我在Microsoft Connect上打开了一个错误报告作为“答案”。

此外,作为解决方法,以下语法有效:

using A<T>::A<T>;
于 2013-09-12T14:48:12.653 回答
0

2013-12-06 更新:Microsoft 已确认该问题,该问题将在 Visual Studio 2013 C++ 编译器中修复。

于 2013-12-06T19:11:31.387 回答