2017-07-14 1 views
3
class Myclass 
{ 

    template <typename T> 
    static T func() 
    { 
     T obj; 
     return obj; 
    } 

    template<> 
    static int func<int>() 
    { 

    } 

}; 

私は上記のクラスを書き、コンパイルしようとしました。 私はエラー以下しまっ:ヘッダーファイル内の静的テンプレート化メンバー関数のテンプレート動作のみ

namespace helper 
{ 
    template <typename T> 
    static T func() 
    { 
     T obj; 
     return obj; 
    } 

    template<> 
    static int func<int>() 
    { 

    } 
} 

class Myclass 
{ 
    template <typename T> 
    static T func() 
    { 
     helper::func<T>(); 
    } 

}; 

私はエラー以下しまっ:

error: explicit specialization in non-namespace scope 'class Myclass'
error: template-id 'func' in declaration of primary template

は、その後、私はクラスのこのような側面を私の静的関数を外に移動する過程その後

error: explicit template specialization cannot have a storage class
In static member function 'static T Myclass::func()':

I私の専門的な機能をインライン化し、それは働いた。

namespace helper 
{ 
    template <typename T> 
    static T func() 
    { 
     T obj; 
     return obj; 
    } 

    template<> 
    inline int func<int>() 
    { 

     return 1; 
    } 
} 

class Myclass 
{ 
    template <typename T> 
    static T func() 
    { 
     helper::func<T>(); 
    } 

}; 

私の質問は以下のとおりです。)なぜ私たちはクラス内の静的メンバ関数を特化することはできません。
2)静的テンプレートに特化した関数がないのはなぜですか?

+0

@tobiあなたがストーリー全体を見れば、私は静的メンバー機能を専門にすることができなかったヘルパー・コーズを入れなければならないことがわかります。 –

+0

ええ、申し訳ありません。私はそれを全部読んだが、何とか終わりに達したら、私はすでに始まりを忘れていた。申し訳ありません;) – user463035818

+0

ここでの混乱の一部は、「名前空間の範囲」という用語です。これは "名前空間で宣言されたブロックの内部"を意味するものではありません。 「クラス、構造体、共用体、関数などの内部にはない」という意味です。ファイルの先頭は名前空間のスコープです。そこに置かれたものはクラスや何かの代わりに*グローバル名前空間*にあるからです。 –

答えて

0

私の知るところでは、C++ではクラスレベルでのメンバーテンプレートの特殊化はできません。専門分野は、名前空間レベルで提供されなければならないので、あなたはクラスの外に特殊化を宣言することができます:あなたはでmyfunc()をインライン化でき、また

// myclass.cpp 

template <> 
static double MyClass::myfunc() 
{ 
    std::cout << "specialized myfunc" << std::endl; 
    return 0.0; 
} 

// myclass.h 
class MyClass 
{ 
public: 

    template <class T> 
    void test(T) 
    { 
     std::cout << "non-specialized test" << std::endl; 
    } 

    template <class T> 
    static T myfunc() 
    { 
     std::cout << "non-specialized myfunc" << std::endl; 
     return T{}; 
    } 
}; 


template <> 
inline void MyClass::test(double t) 
{ 
    std::cout << "specialized test" << std::endl; 
} 

template <> 
static double MyClass::myfunc(); 

/*template <> 
static inline void MyClass::myfunc(double) 
{ 
    std::cout << "specialized myfunc" << std::endl; 
}*/ 

は、その後、あなたがソースファイルで実装を提供しますヘッダーファイル(ちょうどtest()関数のように)。

2番目の質問については、VS2015で試してみましたが、うまくいきました。唯一の問題は、戻り値が不足していることです。

1

正直なところ、両方の質問に対する本当の答えは、おそらく "理由"です。

あなたはメンバ関数テンプレートを特化することができ、それだけで、クラスの外にあり、staticキーワードを使用することはできません。

struct Myclass { 
    template <class T> 
    static T func() { 
     T obj{}; 
     return obj; 
    } 
}; 

template <> 
int Myclass::func<int>() { return 42; } 

はどちらも、ほとんどが文法的な理由です。それはあなたが覚えておかなければならない事の一つです。

関連する問題