VS 2010中的C ++,模板和编译器错误:无效的显式参数

时间:2013-05-07 17:49:15

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

以下代码在g ++(Debian)上正确编译,带有0个警告:

#include <list>

template <typename T>
struct A
{
T a;
typedef T value_type;
};


template <typename T>
struct B
{
 typedef std::list < A <T> > Type;
};


template <typename Data>
void test ( Data d, typename Data::value_type::value_type b ) { }


int main(int argc, char* argv[])
{
B <double> ::Type b;
double c = 0.0;
test <typename B <double>::Type > (b, c);
return 0;
}

但是,使用VS 2010编译器后,发生以下错误:

Error   1   error C2770: invalid explicit template
argument(s) for 'void test(Data,Data::value_type::{ctor})

为什么显式参数不正确?

更新了问题

我不确定您的建议是否被正确理解。你提到过这样的事吗?但是,这种结构对我来说没有意义。

template <typename Data>
void test ( Data d, typename identity <typename    Data::value_type>::type::value_type  b) { }

2 个答案:

答案 0 :(得分:3)

这里的问题是你的编译器实现了一个仅存在于C ++之前的11草案中的规则,并且在那里添加了一个规则,以便在仅通过typedef知道基类时使继承构造函数工作。说using TypedefName::TypedefName;然后使用using声明引用基类构造函数(在您的情况下,参数类型错误地引用A <double>的构造函数)。

问题是即使在使用声明之外,这种处理也是活跃的。在缺陷报告指出之后,处理被简化为仅使用声明。所以你的代码是正确的,编译器是错误的。

答案 1 :(得分:0)

我知道这是一篇旧帖子,但万一它可以帮助任何人(请注意在template的第二个参数的声明中添加test()关键字:

#include <list>

template <typename T>
struct A
{
T a;
typedef T value_type;
};


template <typename T>
struct B
{
 typedef std::list < A <T> > Type;
};


template <typename Data>
void test ( Data d, typename Data::value_type::template value_type b ) { }


int main(int argc, char* argv[])
{
B <double> ::Type b;
double c = 0.0;
test <typename B <double>::Type > (b, c);
return 0;
}

这应该使用VS 2010进行编译