【问题标题】:Conversion operators in class templates类模板中的转换运算符
【发布时间】:2015-08-28 18:39:26
【问题描述】:

我有两个类模板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 {
            ^

【问题讨论】:

    标签: c++ templates type-conversion implicit-conversion conversion-operator


    【解决方案1】:

    我想在TemplateB&lt;T&gt; 中定义一个转换运算符,以允许从TemplateB&lt;T&gt;TemplateA&lt;T&gt; 的隐式类型转换

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

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

    仅当您希望允许从 TemplateB&lt;Foo&gt; 转换为 TemplateA&lt;Bar&gt; 时才需要模板。

    【讨论】:

      【解决方案2】:

      除了T.C.'s answer,如果你愿意,你也可以用另一种方式定义转换——而不是向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)
          { }
      };
      

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-06
          • 1970-01-01
          • 2014-01-16
          • 1970-01-01
          • 2020-10-14
          相关资源
          最近更新 更多