模板化铸造操作员和部分专业化

时间:2011-12-01 19:43:29

标签: c++ templates casting template-specialization

我想用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,看起来像是一个基本问题,但答案(这给出了一个非常复杂的解决方案)看起来是专为字符串设计的。此外,那里的问题结果是歧义,我认为这不是问题 - 我得到一个非常不同的编译器错误消息。

2 个答案:

答案 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 ++ ...