作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码在 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) { }
最佳答案
这里的问题是您的编译器实现了一个规则,该规则仅出现在 C++11 之前的草稿中,并被添加到那里以使继承构造函数在基类仅通过 typedef 已知时工作。说using TypedefName::TypedefName;
然后使 using 声明引用基类构造函数(在您的情况下,参数类型错误地引用了 A <double>
的构造函数)。
问题是这种处理甚至在 using 声明之外也是活跃的。在缺陷报告指出之后,处理减少到仅使用声明。所以你的代码是正确的,编译器是错误的。
关于c++ - 无效的显式参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16425417/
我是一名优秀的程序员,十分优秀!