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" 質問へ
これは、1つの定義ルール違反であり、コンパイラは単に実行するために "1つを選んだ"と推測していますが、その評価については完全にはわかりません。 –
「T」は推測できないので、最初のものは使用できません。もっと最近では、プログラムが不正な形になる(https://timsong-cpp.github.io/cppwp/temp.class.spec#match-3)。 –
私はそれがTの型を解決できないので、最初の専門化はしないと思う。gccはコードをコンパイルするエラーメッセージを出した。テンプレートのパラメータは部分的な専門化では推論できない。私がテンプレート(Tの代わりにint)に明示的に名前をつけると、それはうまくいきます。 – Klaus