0

以下代码在 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) { }
4

2 回答 2

3

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

问题是即使在使用声明之外,这种处理也是有效的。在缺陷报告指出之后,处理减少到仅使用声明。所以你的代码是正确的,编译器是错误的。

于 2013-05-07T18:01:57.867 回答
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 一起编译

于 2013-07-24T11:22:29.273 回答