コンストラクタテンプレートを条件付きで有効にしようとしています。完全なC++ 11準拠のコンパイラでは、余分なデフォルトのテンプレート引数を使用してこれを行う方法を知っています。しかし、私はVS2012をサポートする必要があります。これはstd :: enable_ifを持ちますが、デフォルトの関数テンプレート引数はサポートしていません。 C++ 11ではenable_ifとVS2012のコンストラクタ
、私は次のように記述します。
template<typename T>
struct Class
{
template<typename O,
typename = typename std::enable_if<std::is_convertible<O*, T*>::value>::type>
Class(O*) {}
};
私は次のことを試してみましたが、それはエラーC4336と様々なフォローアップのエラーを与える:
template<typename T>
struct Class
{
template <typename O>
Class(O*, typename std::enable_if<std::is_convertible<O*, T*>::value>::type *= nullptr)
{
}
};
がありますVS2012でこの作業を行う方法はありますか?
追加:
次のようにクラスの使用法は次のようになります。
struct X { };
struct X2 : X { };
struct Y { };
struct Client
{
Client(Class<X> x) {}
Client(Class<Y> y) {}
};
void test() {
X2* x2;
Client client(x2); // error C2668: ambiguous call to overloaded function
// (without std::enable_if)
}
クラスに別のコンストラクタがあるのですか、それとも唯一のコンストラクタですか? – skypjack
実際のクラスには、他のコンストラクタもあります。 – user2019765