2

フー。

template<typename A, typename B>
class Foo{
public:
  Foo();
  /*..*/
};

Foo.cpp

template<typename A, typename B>
Foo<A, B>::Foo(){/*...*/}

template<typename A>
Foo<A, Beta>::Foo(){/* some specialized construction */} //<- this doesn't work.

template<>
Foo<Alpha, Beta>::Foo(){/*...*/} // <-will work, but I want partial specialization.

コンパイルすると、部分的に特殊化されたコンストラクターがエラーをスローします

宣言のネストされた名前指定子 'Foo::' は、クラス、クラス テンプレート、またはクラス テンプレートの部分的な特殊化を参照していません

この部分的に特殊化されたクラスをどこかで宣言する必要があると思いますが、同じクラスを再宣言し続ける必要はありません...つまり、ヘッダーファイルに次を配置する必要はありません。

template<typename A>
class Foo_Beta : public Foo<A, Beta>{
public:
  Foo_Beta();
}

//in cpp
template<typename A>
Foo_Beta<A>() : Foo<A, Beta>() {/**specialized constructor stuff**/}

Foo_Beta コンストラクターを使用するFoo()を構築できないからです。

私はもう試した

template<typename A>
class Foo<A,Beta> : public Foo<A, Beta>{
public:
  Foo();
}

しかし、それもコンパイルされません。

本質的に、そのクラスにすべての内部関数を再宣言せずに、クラスの部分的な特殊化を宣言する構文は何ですか?

4

2 に答える 2

4

他の人が述べたように、関数を部分的に特化することはできません。ただし、テンプレート関数での作業を特殊な実装関数に任せることができます。これにより、部分的な特殊化の効果が得られます。たとえば、次のようになります。

template<class X>
X make_a_B()
{
    return X();  // default implementation
}

template<>
Beta make_a_B<Beta>()
{
    Beta b;
    // do custom things with b...
    return b;  // fully specialised for Beta, everything else uses default case.
}

template<class X>
X make_an_A()
{
    return X();
}

template<typename A, typename B>
class Foo{
public:
    Foo()
    : _myA( make_an_A<A>() )
    , _myB( make_a_B<B>() )
    {}

    /*..*/
    A _myA;
    B _myB;
};

Foo<Alpha, Beta>()とは異なる動作をするようになりましたFoo<Alpha, Gamma>()

于 2015-01-07T16:29:54.547 に答える