私はテンプレートクラス(変更できません)をSomeClass
と呼びましょう。特定のクラスから派生したクラスに特化したいと思っています。 this answer私はgcc 6.3.1でこれを実行できましたが、残念ながらgcc 4.9.2でそれを実行する必要があり、コンパイル時にというエラーが発生しました。 "部分的な特殊化SomeClass<T>
はテンプレート引数を特化していません"派生クラスのテンプレートの特殊化
gcc 4.9.2で動作させるために以下を変更する方法はありますか?
#include <iostream>
#include <string>
using namespace std;
struct A {
string name() { return "A"; }
};
struct B : A {
string name() { return "B"; }
};
struct C {
string name() { return "C"; }
};
template<typename T, typename = std::enable_if_t<std::is_base_of<A, T>::value>>
using enable_if_a = T;
template<typename T>
struct SomeClass {
using Type = T;
};
template<typename T>
struct SomeClass<enable_if_a<T>>
{
using Type = A;
};
int main(int, char**)
{
SomeClass<A>::Type el1;
SomeClass<B>::Type el2;
SomeClass<C>::Type el3;
cout << el1.name() << "," << el2.name() << "," << el3.name() << endl;
}
は出力:
A,A,C
@AndyG私が専門でない場合、私は "A、B、C"を得るだろう。私はAとBの専門化が欲しい。 – eddi
これはこれと重複しているようだ:https://stackoverflow.com/questions/12858839/using-sfinae-for-template-class-specialisation重複していなければあなたの答えはおそらくそこにあります... gcc 4.9.2とすべて –
@Drt私はOPで言及しています - その質問は私の出発点でした - 私は自分のニーズに合わせてそれをどうやって調整するのか分かりません。私の現在の試みは4.9.2で動作しません。 – eddi