下面这段代码是我试图从GCC/G ++移植到Microsoft Visual C++ 2010的大型项目的简化示例。它使用G ++进行编译,但与MSVC++,它会引发错误,我无法理解为什么。使用模板类的成员在MSVC++中实例化模板默认参数
template <typename A, typename B = typename A::C::D> // line 1
struct foo
{
typedef int type;
};
template <template <typename> class E, typename T>
typename foo<E<T> >::type // line 8
bar(){}
从MSVC++的错误消息是:
example1.cpp(1) : error C2027: use of undefined type 'E<T>'
example1.cpp(8) : error C2146: syntax error : missing ',' before identifier 'D'
example1.cpp(8) : error C2065: 'D' : undeclared identifier
我已经尝试了一些改变,以缩小问题了一下,虽然我不完全了解它,这就是我”我发现:如果在第1行,我用A::C
替换A::C::D
,它工作正常。如果我用typename E
替换template <typename> class E
并使其成为foo<E>
,那么它工作正常。如果明确指定第二个模板参数foo
在第8行,像这样,它工作正常:
typename foo<E<T>, typename E<T>::C::D>::type // line 8
而且,如果我在1号线的东西无害像typename B = A
替换使用的A::C::D
,但增加了一个不同的使用A::C::D
作为typedef typename A::C::D qux;
到foo
的定义,这也工作正常。
任何想法?我错过了多少C++规则?
你有没有考虑报告bug?这些“错误未出现时的可疑情况”表明它是正确的。 http://connect.microsoft.com/VisualStudio – jpalecek 2010-07-18 17:24:37
我有,但我想确定它实际上是一个错误第一 - 我遇到过这样的事情之前,事情证明我错过了一些需要一个'typename'由于C++语法的一个不明确的角落。还是)感谢你的建议! – 2010-07-18 17:28:30
为了记录,我最终提出了这个错误;感谢您的链接做到这一点。 – 2010-07-23 18:08:54