1

2 つのクラス テンプレート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 {
            ^
4

3 に答える 3

0

テンプレート パラメーターは型定義の一部を形成するため、変換演算子で省略することはできません。

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

コンパイラがテンプレート化された型をテンプレートの計算された型に追加すると考えると役に立ちます。したがって、コードはoperator TemplateA_ClassA() const、に変換するために使用されるTemplateB_ClassAようなものを生成しTemplateA_ClassAます。

于 2015-08-28T18:42:08.280 に答える