2016-10-01 13 views
1

私はテンプレート化されたメソッドで普通のクラスを作成しました。すべてのメソッドインスタンスは明示的にインライン化されています。明示的なクラスメンバーのインスタンス化

class MyClass 
{ 
    template<int N> inline void MyMethod(); 
    template<> inline void MyMethod<1>() { cout << 1; } 
    template<> inline void MyMethod<2>() { cout << 2; } 
}; 

のように私はそれをコンパイルする必要があり template<>構文を使用する必要がありました。私はクラス宣言の外のメソッドを明示的に定義したり、構文バリアントを使用したりするなど、他の解決策を試してみました。 (これは、以降のバージョンで試したことのない、VS2008の下で行われた。)私は2つの質問持って

  • これはポータブルですが?
  • 意味がありますか?

答えて

2

あなたの書き方は間違っていて動作しません。
メンバーメソッドの専門分野は、自分のクラスの外に置かれている必要があります

class MyClass 
{ 
    template<int N> void MyMethod(); 
}; 

template<> void MyClass::MyMethod<1>() { } 
template<> void MyClass::MyMethod<2>() { } 

それはポータブルだし、それが理にかなっている場合はほとんどがあなたの実際の問題に依存し、それはあなたの例から言うのは難しいです。

+0

このようなテンプレートメソッドの特殊化(ヘッダーにはこれらの特殊化の適切な宣言が含まれている限り)をソースファイルに移すことができます。それは非特定のメソッドテンプレートではできませんが... –

+0

それはなぜ、それは動作しますか? –

+0

@YvesDaoust実際には(https://godbolt.org/g/yEBYVo)[仕事](https://godbolt.org/g/GzWrlo)はありません。多分あなたのコンパイラの拡張? – skypjack

1

メンバテンプレートをクラス本体で完全に特殊化することはできません。しかし、部分的な特殊化は許されている。完全な特殊化は、クラス本体の外側で宣言/定義する必要があります(宣言されていない場合は、cppファイルに定義する必要があります。inline)。

参考として、questionです。

+0

そして、メソッドを部分的に特殊化することはできません(構文的に禁止されています)。クラス内でメソッドの特殊化を定義することはできません...しかし、定義がソースファイルにあることが厳密に要求されるかどうかはわかりませんオプションではありませんが、それは特殊化されていないメソッドテンプレートのオプションではありません... –

+0

非常に申し訳ありません、私はインライン展開 –

関連する問題