2010-07-18 69 views
1

下面这段代码是我试图从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++规则?

+1

你有没有考虑报告bug?这些“错误未出现时的可疑情况”表明它是正确的。 http://connect.microsoft.com/VisualStudio – jpalecek 2010-07-18 17:24:37

+0

我有,但我想确定它实际上是一个错误第一 - 我遇到过这样的事情之前,事情证明我错过了一些需要一个'typename'由于C++语法的一个不明确的角落。还是)感谢你的建议! – 2010-07-18 17:28:30

+0

为了记录,我最终提出了这个错误;感谢您的链接做到这一点。 – 2010-07-23 18:08:54

回答