以下代码在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) { }
答案 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进行编译