私はコンストラクタを持たないクラスから派生しようとしています。int
からですが、nullptr
から、1つの引数を取るときにできるだけジェネリックとしてコンストラクタを作成しようとしています。SFINAEがnullptrのオーバーロードで動作しないのはなぜですか?
#include <cstddef>
#include <iostream>
struct Base
{
Base(std::nullptr_t){}
Base(){}
// some other constructors, but not from int
};
struct Test : Base
{
Test(std::nullptr_t) : Base(nullptr)
{
std::cerr << "Test(nullptr)\n";
}
template<typename T>
Test(T v) : Base(v) {}
};
int main()
{
Base b=0; // works
Test z=nullptr; // works
Test t=0; // compilation error
}
なぜそれが起こるん。しかし、いくつかの理由のために正しいコンストラクタは失敗でテンプレートコンストラクタの結果にint
の置換があっても、取られるとは思われませんか? SFINAEが意味するものではありませんか?そして、私はこの問題をどのように修正できますか?
SFINAE-effect –
の場合、 'template'を使用してください。 –
短いストーリー: '0'は' nullptr'になるための変換が必要なので、テンプレートが優先されます。 – Quentin