使用模板类的成员在MSVC ++中实例化模板默认参数

时间:2010-07-18 17:18:37

标签: c++ visual-c++ visual-studio-2010 templates

以下代码是我正在尝试从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 ++规则?

1 个答案:

答案 0 :(得分:1)

根据jpalecek的建议,我将此报告为微软的一个错误,微软已经证实这确实是他们编译器的错误:

https://connect.microsoft.com/VisualStudio/feedback/details/576196