class 个模板中的转换运算符

Conversion operators in class templates

我有两个 class 模板 TemplateA<T>TemplateB<T>。现在,我想在 TemplateB<T> 中定义一个转换运算符,以便允许从 TemplateB<T>TemplateA<T> 的隐式类型转换。但是,以下代码会产生编译错误:

struct ClassA {};

template<typename T>
struct TemplateA {
  T val;
};

template<typename T>
struct TemplateB {
  T val;

  template<typename ValT>
  operator TemplateA() const {
    TemplateA<ValT> a;
    a.val = val;
    return a;
  }
};

int main() {
  TemplateB<ClassA> b;
  TemplateA<ClassA> a = b;
  return 0;
}

错误:

main.cpp:13:12: error: expected type-specifier before 'TemplateA'
   operator TemplateA() const {
            ^

模板参数构成类型定义的一部分,因此您不能在转换运算符中省略它:

template<typename ValT>
  operator TemplateA<ValT>() const {
    TemplateA<ValT> a;
    a.val = val;
    return a;
  }

认为编译器会将模板化类型附加到模板的计算类型上会有所帮助。因此,您的代码将生成类似 operator TemplateA_ClassA() const 的内容,用于将 TemplateB_ClassA 转换为 TemplateA_ClassA

I want to define a conversion operator in TemplateB<T> to allow implicit type conversions from TemplateB<T> to TemplateA<T>

不需要转换函数模板。一个简单的转换函数就可以:

operator TemplateA<T>() const {
    TemplateA<T> a;
    a.val = val;
    return a;
}

仅当您希望允许从 TemplateB<Foo> 转换为 TemplateA<Bar> 时才需要模板。

除了 之外,您还可以选择其他方式来定义转换 - 您可以添加 TemplateB 而不是向 TemplateB 添加 [非模板] 转换函数非模板] 将构造函数转换为 TemplateA:

template<typename T>
struct TemplateB {
    T val;
};

template<typename T>
struct TemplateA {
    T val;

    TemplateA() = default;

    // converting constructor
    TemplateA(TemplateB<T> const& t)
    : val(t.val)
    { }
};