我想用bool的专业化来模拟转换操作符,但它不起作用。
template<typename T> //Don't know if the fact that C is templated itself is relevant here
class C
{
...
template<typename U> operator U() const { return another_namespace::MyCast<U>(*this); }
template<> operator bool() const { return IsValid(); }
};
这给了我(g ++ 4.6)
非命名空间范围中的显式特化“C类&lt; T&GT;”
现在只是
operator bool() const { return IsValid(); }
本身就像MyCast一样工作(它是在外部命名空间中声明的友元函数)。我有什么办法可以在这里获得预期的behHoavior吗?
编辑:我后来发现this,看起来像是一个基本问题,但答案(这给出了一个非常复杂的解决方案)看起来是专为字符串设计的。此外,那里的问题结果是歧义,我认为这不是问题 - 我得到一个非常不同的编译器错误消息。
答案 0 :(得分:3)
您可以重载转化运算符,因此只需使用operator bool()
的非模板化版本即可:
template<typename T>
class C
{
...
template<typename U> operator U() const { ... }
operator bool() const { ... }
};
答案 1 :(得分:0)
我尝试专门化类型转换操作符模板,当我在类定义中定义了特化时,我遇到了同样的问题。但是当我搬到外面时,它就像一个魅力!
示例定义:
struct A {
int i;
A(int v) : i(v) {
cout << __PRETTY_FUNCTION__ << endl;
}
template <typename T>
operator T() {
cout << __PRETTY_FUNCTION__ << " - NOT IMPLEMENTED" << endl;
throw;
return 0;
}
// Compilation error
// error: explicit specialization in non-namespace scope ‘struct A’
//template <>
//operator double() {
// cout << __PRETTY_FUNCTION__ << " - !!! IMPLEMENTED" << endl;
// return (double)i;
//}
};
// But this works well!!
template <>
A::operator double() {
cout << __PRETTY_FUNCTION__ << " - !!! IMPLEMENTED" << endl;
return (double)i;
}
示例主要:
A a(5);
double d = a;
long l = a;
输出:
A::A(int)
A::operator T() [with T = double] - !!! IMPLEMENTED
A::operator T() [with T = long int] - NOT IMPLEMENTED
terminate called without an active exception
经测试:g ++(Debian 4.7.2-5)4.7.2没有任何额外的参数。
我也会尝试使用更老的g ++ ...