【发布时间】:2013-01-08 22:03:43
【问题描述】:
此代码将失败并显示错误消息(行号已关闭)。我该如何解决这个问题(保持相同的意图)?
g++ -o c_test c_test.cpp
c_test.cpp:在函数'int main(int, char**)'中:
c_test.cpp:28:18: 错误:没有匹配函数调用'wcalc(CWrapped::u_type&)'
c_test.cpp:28:18: 注意:候选人是:
c_test.cpp:17:58: 注意:模板 int wcalc(typename CWrapped::u_type)
包装的类型被传递给“calc”和“wcalc”函数,但是第二个失败了。 我希望能够包装类型,这样我就可以使用编译时定义来指定不同的类型,但仍然使用相同的包装函数
// Example template class
template <int T_B>
class m_int {
public:
int x;
m_int() { x = T_B; }
int to_int() { return(x); }
};
// Desired Typedef wrap
template <int T_BITS> struct CWrapped {
typedef m_int<T_BITS> u_type;
};
// This is ok, no wrapping
template <int T_BITS> int calc(m_int<T_BITS> x) {
return(x.to_int());
}
// This fails when instantiated
template <int T> int wcalc(typename CWrapped<T>::u_type x) {
return(x.to_int());
}
int main(int argc, char* argv[]) {
CWrapped<5>::u_type s;
int x = calc(s);
int y = wcalc(s);
return(0);
}
【问题讨论】:
-
如果你用模板参数调用它会工作:
wcalc<5>(s); -
我猜编译器无法推断出值
T:尝试在调用wcalc时明确指定它