3

テンプレート化されたクラスがあり、その外部から public static 変数にアクセスしたいのですが、テンプレートをインスタンス化せずにアクセスする方法がわかりません。このコード:

template<class T>
class TemplatedClass {
    public:
        static const int static_member = 10;
};

...

int i = TemplatedClass::static_member;

次のエラーが生成されます:「'template class TemplatedClass' used without template parameters.」

変数にアクセスするときにクラスをインスタンス化すると:

int i = TemplatedClass<int>::static_member;

エラーはなくなります。エラーを抑制するためだけに、ダミーの型引数では実際には意味をなさないコンテキストでテンプレートをインスタンス化する必要はありません。私がしなければならない場合、使用するのに最適なダミータイプは何ですか? <> と <void> を試しましたが、どちらもうまくいきませんでした。

4

2 に答える 2

4

特殊化が値をオーバーライドする可能性があるため、実行できません。つまり:

template<class T>
class TemplatedClass : public BaseClass
{
    static const int value = 42;
};

template<>
class TemplatedClass<StarTrek>
{
    static const int value = 47;
}

したがって、異なる値が得られます。

TemplatedClass<StarTrek>::value != TemplatedClass<void>::value      

値を等しくする必要がある場合は、テンプレート以外の基本クラスを追加することを強くお勧めします。

class BaseClass {
public:
    static const int value = 42;
};

template<class T>
class TemplatedClass : public BaseClass
{
    ...
}

ダミーの型 (つまり void) をインスタンス化するか明示的に使用するとうまくいくかもしれませんが、テンプレート パラメーターの使用方法によってはコンパイル エラーが発生する可能性があります。

int x = TemplatedClass<void>::value;

したがって、意図を明確に示すコードを記述してください。つまり、すべてのインスタンス化に共通の値を型依存のテンプレート クラスに含めないでください。それができない場合は、何をしようとしているのかを詳しく説明してください。

于 2013-02-13T05:46:23.960 に答える
2

ダミー型を使用すると、単純なクラスではうまくいくかもしれませんが、物事がより複雑になるとうまくいきません。

あなたのクラスが次のように「続く」と想像してみましょう:

template<class T>
class TemplatedClass {
public:
    static const int static_member = 10;
    typedef typename std::enable_if< std::is_integral< T >::value >::type type;
};

このコードは、Tが非整数型であってはならないことを示しています。

更新 (jogojapan に感謝): そのため、場合によっては、どの型もダミーとして使用できないことがあります。

于 2013-02-13T05:54:23.150 に答える