6

私は gcc/4.7 を使用しており、テンプレート関数 (またはメンバー関数) で template-template 引数を使用してクラスをインスタンス化する必要があります。次のエラーが表示されます

test.cpp: In function 'void setup(Pattern_Type&)':
test.cpp:17:34: error: type/value mismatch at argument 1 in template parameter list for 'template<template<class> class C> struct A'
test.cpp:17:34: error:   expected a class template, got 'typename Pattern_Type::traits'
test.cpp:17:37: error: invalid type in declaration before ';' token
test.cpp:18:5: error: request for member 'b' in 'a', which is of non-class type 'int'

スニペットでマークされた 2 行をコメント化すると、コードが実行されるため、A a は「メイン」ではインスタンス化できますが、「セットアップ」ではインスタンス化できません。これは他の人にとっても興味深いと思います。コードが機能しない理由を理解していただければ幸いです。これがコードです

struct PT {
  template <typename T>
  struct traits {
    int c;
  };
};

template <template <typename> class C>
struct A {
  typedef C<int> type;
  type b;
};

template <typename Pattern_Type>
void setup(Pattern_Type &halo_exchange) {
  A<typename Pattern_Type::traits> a; // Line 17: Comment this
  a.b.c=10; // Comment this
}

int main() {
  A<PT::traits> a;

  a.b.c=10;

  return 0;
}

提案と修正をありがとう!マウロ

4

1 に答える 1

10

Pattern_Type::traitsテンプレートとしてマークする必要があります:

A<Pattern_Type::template traits> a;

これは、テンプレート パラメータに依存するため必要ですPattern_Type

は型ではなくテンプレートでtypenameあるため、そこでも使用しないでください。traits

于 2012-12-20T14:50:12.663 に答える