2012-01-25 20 views
1

このコードを意図したとおりに動作させる方法はありますか?クラステンプレートの静的関数をその(部分)特殊化から呼び出す

#include <iostream> 
using namespace std; 

template<typename T> class templated{ 
public: 
    static void f(){ 
     cout<<"doing something generically"<<endl; 
    } 
}; 

template<> class templated<int>{ 
public: 
    static void g(){ 
     cout<<"doing something else, but specific to int"<<endl; 
     f(); 
    } 
}; 

int main(){ 
    templated<int>::g(); 
} 

G ++は、スコープ内でfが宣言されていないと文句を言います。私はf()templated<int>::f()、ダミー宣言をtemplatedに入れ、クラス定義の外で宣言を移動するなど)を呼び出す可能性のあるすべてのバリエーションを試しましたが、すべて失敗しましたのでここでは省略します。

+0

をそして、あなたをしました'テンプレート :: f()'を試してみてください。私は本当にそれを取得しません。 – ypnos

+1

プライマリクラステンプレート 'template class templated'はあなたが呼び出せるスタティックメンバの型ではありません。それをする目的は何ですか? –

+0

@ypnos確かに私はやった。しかし答えは明らかに私が望むことをすることができないと主張するようです。 –

答えて

1

いいえ、専門は完全に基本テンプレートとは別物であり、それから何かを "継承"しません。

多分どこからでも呼び出せる無料の関数を追加できますか?

+0

ええ、私は両方の自由な機能と継承を検討しています。私はジェネリックで特殊なクラステンプレートが完全に分離しているのだろうかと思います。この方法では、振る舞いのわずかな部分だけを変更する必要がある場合でも、クラスの機能を再定義する必要があります。 –

+0

これらは*別々に宣言しているため*別個です。いくつかの共通の機能が必要な場合は、いつものように共通の基底クラスにその機能を置くことができます。 –

1

あなたの特化したバージョンは、とf()(ここでは「継承」はありません)を持っていません。はありません。

継承が必要な場合は、おそらくf()を基本クラスに移動することを検討する必要があります。

2
テンプレートの引数の型を使用していないので、あなたは、この特定のケースでは継承でき

template<> class templated<int>: templated<void>{ 
public: 
    static void g(){ 
     cout<<"doing something else, but specific to int"<<endl; 
     f(); 
    } 
}; 
+0

うわー、これはトリップです。私はこれをどのように読むべきですか?彼のジェネリックフォームから継承するテンプレート特殊化、またはテンプレート化されたテンプレートのダミーバージョンを継承した、名前が「templated」のダミーのテンプレートリストを持つクラスだけです。 –

+0

このアプローチには注意が必要ですか? –

+0

@Lorenzo - 'templated 'はベーステンプレートを使用します。しかし、そうであれば、テンプレートもかなり無駄です(T = void型のメンバーを持つことはできませんので、それは何のために使われますか?)。 –

0

ラッパーのいくつかの種類、このようないくつか使用することができます。

template<typename T> 
    class templated_core 
    { 
     public: 
     static void f() 
     { 
      cout<<"doing something generically"<<endl; 
     } 
    }; 

    template<typename T> 
    class templated : public templated_core<T> 
    { 
    }; 

    template<> 
    class templated<int> : public templated_core<int> 
    { 
     public: 
     static void g() 
     { 
      cout<<"doing something else, but specific to int"<<endl; 
      f(); 
     } 
    }; 
関連する問題