2017-02-14 4 views
0

私は1つのポストにMWEを下に見ることができる別の構造体A.テンプレート構造の特殊::

内で定義されたタイプと構造体Bを専門としたいです。

最初に、私はBの2つの特殊化が一緒に存在することに驚いています。私は問題を示すために2つ目を追加しました。削除された場合、コードはBの適切な特殊化を参照しません。 最初の特殊化のみを維持したいと考えています。

だから、私の質問は以下のとおりです。

  • Bの2つの専門が一緒に存在できるのはなぜ?
  • メインのインスタンシエーションで最初のものが適用されないのはなぜですか?

definitions.h:

template <class T> 
class X {}; 

template <class T> 
class Xitem {}; 


template <class T> 
struct A; 

template <class T> 
struct A< X<T> > { 
    typedef Xitem<T> Titem; 
}; 

template <class T> 
struct B; 

template <class T>//I need this one only 
struct B< typename A< X<T> >::Titem > { 
    static void foo() { 
     std::cout << "foo 1" << std::endl; 
    } 
}; 

template <class T> 
struct B< Xitem<T> > { 
    static void foo() { 
     std::cout << "foo 2" << std::endl; 
    } 
}; 

はmain.cppに:

#include "definitions.h" 

int main(int argc, char *argv[]) { 

    B< A< X<int> >::Titem >::foo(); 
} 

出力: "FOO 2" 質問へ

+0

これは、1つの定義ルール違反であり、コンパイラは単に実行するために "1つを選んだ"と推測していますが、その評価については完全にはわかりません。 –

+1

「T」は推測できないので、最初のものは使用できません。もっと最近では、プログラムが不正な形になる(https://timsong-cpp.github.io/cppwp/temp.class.spec#match-3)。 –

+1

私はそれがTの型を解決できないので、最初の専門化はしないと思う。gccはコードをコンパイルするエラーメッセージを出した。テンプレートのパラメータは部分的な専門化では推論できない。私がテンプレート(Tの代わりにint)に明示的に名前をつけると、それはうまくいきます。 – Klaus

答えて

0

回答がコメントで与えられたXcodeの7を使用しました。ありがとう。

関連する問題