3

そのため、非型テンプレート関数を持つポリシーを使用しようとしています。コンパイラは、私がやろうとしていることを理解するのにいくつかの問題を抱えています。

たとえば、1 つのポリシーは次のようになります。

template <int unsigned NBits> struct Foo {

/* Internal data type that provides NBits of storage */
typedef int unsigned DataType; // for  example

/* Accessor */
template <int unsigned QueryBit>
bool const IsBitSet(DataType const &) const { /* ... */ }

};

もう 1 つのポリシーは、これを使用して、設定されたビットに対して一連の操作を実行します。

template <typename FooPolicy> struct DoBar_WithFoo {

FooPolicy FooPolicy_;

bool const XOR_SpecificBits(FooPolicy::DataType const &Data) const {
  // Error listed below points to this line
  return FooPolicy_.IsBitSet<10>(Data) ^ FooPolicy_.IsBitSet<8>(Data) /* ... */ ;
}

};

ユーザー クラスには、Foo ポリシーと Bar ポリシーが必要です。

template<typename FooPolicy, typename DoBar_Policy> struct UserClass {

  // Use FooPolicy for data

  void MyFunction() {
    // Use DoBar_Policy to manipulate data
  }
};

ユーザーは上記の 2 つを次のように組み合わせます。

typedef Foo<12> Foo_12Bits_type;
typedef DoBar_WithFoo<Foo_12Bits_Type> Bar_type;

typedef UserCLass<Foo_12Bits_type, Bar_type> MyUserClass;

MyUserClass.MyFunction();

次のようなエラーが表示されます。

error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'

このエラーは、次のコード ビットを指しています (上記のコメントのとおり)。

/* ... */ FooPolicy_.IsBitSet<10>(Data) /* ... */

ここから推測できるのは、<10> は比較操作のように見えるということです。しかし、ポリシーに含まれるテンプレート関数の特殊化をコンパイラに求めているのです。

私はこれを行うことができますか?どうすればこれを行うことができますか?

疑問に思っている人がいれば、私は LFSR を書こうとしています。将来的には別の基になるデータ型に移行したいと考えています。また、LFSR を生成するために使用される特定の多項式を、LFSR ビットの格納と操作に使用されるデータ型および操作とは別に保持したいと考えています。

前もって感謝します!

4

1 に答える 1

2

templateメンバーの名前の直前にキーワードを挿入して、ネストされた関数テンプレートの呼び出しを明確にする必要があります。

bool const XOR_SpecificBits(FooPolicy::DataType const &Data) const {
  // Error listed below points to this line
  return FooPolicy_.template IsBitSet<10>(Data) ^ FooPolicy_.template IsBitSet<8>(Data) /* ... */ ;
                    ^^^^^^^^                                 ^^^^^^^^
}

なぜこれを行う必要があるのか​​ については、この有名な Q&Aを参照してください。

于 2013-08-16T18:26:13.477 に答える