0

部分的に特殊化されたバージョンのメソッドを別のクラスに提供するために使用されるヘルパークラスがあります。プライマリテンプレートと2つのスペシャライゼーションがあります。

template<typename BASE, typename ACCESS_METHOD, int MODULE>
struct BaseHelper
{
    void f1()
    {
      ....
    }
 }

template<typename BASE, int MODULE>
template<typename DEVICE>
struct BaseHelper< BASE, StrangeAccessMethod< DEVICE >, MODULE >
{
    void f1()
    {
      ....
    }
 }

template<typename BASE, int MODULE>
struct BaseHelper< BASE, uint32_t, MODULE >
{
    void f1()
    {
      ....
    }
 }

次の場合:

FpgaBaseHelper< SomeBaseClass, AccessMethod, 1 > helper1;
FpgaBaseHelper< SomeBaseClass, StrangeAccessMethod<MyDevice>, 2> helper2;
FpgaBaseHelper< SomeBaseClass, uint32_t, 3 > helper3;

次に、結果として、プライマリテンプレートがhelper1とhelper2に対してインスタンス化され、3番目のテンプレートがuint32_tスペシャライゼーションをインスタンス化します。

StrangeAccessMethod <>スペシャライゼーションを使用するには、helper2が必要です。

私は何が間違っているのですか?

4

1 に答える 1

1

表記:

template<typename BASE, int MODULE>
template<typename DEVICE>
struct BaseHelper< BASE, StrangeAccessMethod< DEVICE >, MODULE >
{
}

正しくありません。プライマリテンプレートで定義されていないネストされたテンプレートを参照します。ほとんどの場合、コンパイラは、テンプレートを使用する他の多くの場合のように何も言っていません。

複数のテンプレートヘッダーは、次の場合にのみ使用できます。

template<typename BASE, int MODULE> struct BaseHelper
{
  template<typename DEVICE> struct InnerTemplate;   // This is forward declaration.
}

template<typename BASE, int MODULE>
template<typename DEVICE>
struct BaseHelper<BASE, MODULE>::InnerTemplate
{
    // Definition.
}

あなたが試すことができます:

template<typename BASE, int MODULE, typename DEVICE>
struct BaseHelper< BASE, StrangeAccessMethod< DEVICE >, MODULE >
{
}

多分それはうまくいくでしょう。

于 2012-08-03T21:31:50.140 に答える