0

別のテンプレート化されたクラス (ここでは A) から継承し、(ここでは int var の) 静的メンバーの特殊化を実行するテンプレート化されたクラス (ここでは C) を作成しようとしていますが、これを行うための正しい構文を取得できません (可能な場合)。

#include <iostream>

template<typename derived>
class A
{
    public:
        static int var;
};

//This one works fine
class B
    :public A<B>
{
    public:
        B()
        {
            std::cout << var << std::endl;
        }
};
template<>
int A<B>::var = 9;

//This one doesn't works
template<typename type>
class C
    :public A<C<type> >
{
    public:
        C()
        {
            std::cout << var << std::endl;
        }
};
//template<>
template<typename type>
int A<C<type> >::var = 10;

int main()
{
    B b;
    C<int> c;
    return 0;
}

テンプレート化されていないクラス (ここでは B) で動作する例を示します。var の静的メンバーの特殊化を取得できますが、C では動作しません。

これがgccが教えてくれることです:

test.cpp: In constructor ‘C<type>::C()’:
test.cpp:29:26: error: ‘var’ was not declared in this scope
test.cpp: At global scope:
test.cpp:34:18: error: template definition of non-template ‘int A<C<type> >::a’

私はgccバージョン4.6.3を使用しています。助けてくれてありがとう

4

2 に答える 2

0

varを記述することにより、メンバー変数であるコンパイラーにヒントを与えることができますthis->var

テンプレートスペシャライゼーションの静的メンバーを定義するテンプレートを作成することはできませんA<C<type>>。ストレージを予約している静的メンバーを定義するが、テンプレートの部分的な特殊化を記述しても、どの完全な特殊化のためにストレージを予約するかはコンパイラーに通知されません。あなたができる最善のことは書くことです

template<>
int A<C<int> >::var = 10;

別の方法は、テンプレート関数を介してアクセスされる関数レベルの静的を使用することです。

template<typename T> class A {
    static int &var() { static int var; return var; }
};
于 2012-07-11T09:11:31.577 に答える
0

親クラスで列挙型を使用し、子クラスの値をテンプレート パラメーターとして親に設定することをお勧めします。クラス C が var を「参照」するには、修飾することができます。下記参照:

#include <iostream>
using namespace std;

template<typename Child, int i = 0> // 0 is the default value
class A
{
    public:
        enum { var = i };
};

class B
    :public A<B>   // define the value or var here
{
    typedef A<B> Parent;
public:
    B()
    {
        cout << Parent::var << endl; // Parent:: here IS NOT necessary, just for uniformity's sake
    }
};

template<typename type>
class C
    :public A<C<type>, 200>  // define the value of var here
{
    typedef A<C<type>, 200> Parent;
public:
    C()
    {
        cout << Parent::var << endl; // Parent:: here IS necessary
    }
};


int main()
{
    cout << B::var << endl;
    cout << C<int>::var << endl;
    cout << C<char>::var << endl;
}
于 2012-07-11T10:10:19.367 に答える