1

我有两个类模板TemplateA<T>TemplateB<T>. 现在,我想定义一个转换运算符,TemplateB<T>以允许从TemplateB<T>to进行隐式类型转换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 {
            ^
4

3 回答 3

2

我想定义一个转换运算符TemplateB<T>以允许隐式类型转换TemplateB<T>TemplateA<T>

这不需要转换函数模板。一个普通的转换函数会做:

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

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

于 2015-08-28T20:20:29.153 回答
1

除了TC 的答案之外,如果您愿意,您还可以以其他方式定义转换 -TemplateB您可以将 [non-template] 转换构造函数添加到:而不是添加 [non-template] 转换函数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)
    { }
};
于 2015-08-28T20:25:36.877 回答
0

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

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

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

于 2015-08-28T18:42:08.280 回答