以下代码是我正在尝试从GCC / G ++移植到Microsoft Visual C ++ 2010的大型项目的简化示例。它使用G ++进行编译,但是使用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::D
替换为{{1}它工作正常。如果我仅使用A::C
替换template <typename> class E
并生成typename E
,则可以正常使用。如果在第8行中明确指定foo<E>
的第二个模板参数,就像这样,它可以正常工作:
foo
并且,如果我将typename foo<E<T>, typename E<T>::C::D>::type // line 8
的使用替换为第1行中A::C::D
之类的无关紧要的内容,则将typename B = A
的{{1}}添加为A::C::D
用于定义typedef typename A::C::D qux;
,也可以。
有什么想法吗?我错过了什么C ++规则?
答案 0 :(得分:1)
根据jpalecek的建议,我将此报告为微软的一个错误,微软已经证实这确实是他们编译器的错误:
https://connect.microsoft.com/VisualStudio/feedback/details/576196