我的示例如下表明,从非模板类型到模板类型的隐式转换将无法像仅涉及非模板类型的那样无缝地转换。有没有办法让他们继续工作?隐式转换为模板
例子:
struct point;
template<unsigned d> struct vec {
vec() { }
// ...
};
template<> struct vec<2> {
vec() { }
vec(const point& p) { /* ... */ } // Conversion constructor
// ...
};
struct point {
operator vec<2>() { return vec<2>(/* ... */); } // Conversion operator
};
template<unsigned d> vec<d> foo(vec<d> a, vec<d> b) {
return vec<d>(/* ... */);
}
template<unsigned d1, unsigned d2>
vec<d1 + d2> bar(vec<d1> a, vec<d2> b) {
return vec<d1 + d2>(/* ... */);
}
int main(int argc, char** argv) {
point p1, p2;
vec<2> v2;
vec<3> v3;
foo(v2, p1);
foo(p2, v2);
foo(p1, p2);
bar(v3, p1);
}
有没有办法让这个代码自动转换从point
到vec<2>
?
我知道我可以超载foo
和bar
允许point
参数,使用显式转换委托给vec
实施。但是,对所有参数组合进行此操作将变得乏味,特别是对于具有许多此类参数的功能。所以我对解决方案不感兴趣,我必须为每个函数的每个参数组合重复代码。
看来,转换构造函数和转换运算符都不足以实现这一点。至少我的gcc 4.7.1报告了no matching function call
,虽然它在一个通知中命名了所需的功能,说明‘point’ is not derived from ‘vec<d>’
。
哪条线给出了该错误?另外,'unsigned'不是C++类型。 – 2013-02-22 06:59:20
@詹姆斯:错误报告的功能调用的行,但通知还提及其他各种行。随意复制并编译上面的代码,因为它是独立的。 [C++ 11标准]第3.9.1节(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf)命名'unsigned',那么为什么会那不是C++类型,与C共享? – MvG 2013-02-22 07:04:46
不,它将'unsigned char','unsigned short int','unsigned int','unsigned long int'和'unsigned long long int'声明为无符号整数类型。 – 2013-02-22 07:08:26