3

1つの型パラメンターと1つのブール値を持つテンプレートクラスを作成しています。コードは次のとおりです。

template<class T, bool p = true>
class A
{
private:
    T* ptr;
public:
    A();
};


template<class T>
A<T,true>::A()
{
    ptr = 0xbaadf00d;
}

int main()
{
    A<int> obj;
    A<int, false> o;
    return(0);
}

そして、私はこれらのコンパイルエラーを受け取ります:

Error   1   error C3860: template argument list following class template name must list parameters in the order used in template parameter list tst.cpp 15
Error   2   error C2976: 'A<T,p>' : too few template arguments  tst.cpp 15

私は何が間違っているのですか?それとも、何らかの理由で非型パラメータを部分的に特殊化することは禁じられていますか?

同時に、ifステートメントでbooleanパラメーターを使用すると、次の警告が表示されます。

Warning 1   warning C4127: conditional expression is constant

だから私はこの種のことに特化することになっています...

どんな助けでも大歓迎です!:)

前もって感謝します!!!!

4

2 に答える 2

7

メソッドを部分的に特殊化しようとしています。それは許されません。クラス全体を部分的にしか特化できません。クラスを特殊化したら、部分的に特殊化されたクラスのメソッドの特殊化されていない定義を提供できます。

これは、あなたが望むことをするかもしれないいくつかのコードの例です:

template<class T, bool p = true>
class A
{
private:
    T* ptr;
public:
    A();
};

template <class T>
class A<T,true> {
private:
    T* ptr;
public:
    A();
};


template <class T>
class A<T,false> {
private:
    T* ptr;
public:
    A();
};

template<class T>
A<T,true>::A()
{
    ptr = reinterpret_cast<T *>(0xbaadf00d);
}

template<class T>
A<T,false>::A()
{
    ptr = 0;
}

int main()
{
    A<int> obj;
    A<int, false> o;
    return(0);
}
于 2012-06-20T21:36:56.117 に答える
6

型以外のテンプレート パラメーターを特化することは歓迎されますが、テンプレート クラスの 1 つの関数だけを特化することはできません。クラスはテンプレートなので、クラス特化する必要があるものです。つまり、コンストラクターの特別な定義を与えるには、クラス全体の特別な定義を提供する必要があります。

于 2012-06-20T21:36:24.943 に答える