#include <iostream>
using namespace std;
template <typename T>
class test {
public:
T value;
template <typename... Args, typename = decltype(T())>
test(Args... args): value(args...)
{
cout <<"ctor running\n";
}
template <typename... Args>
test(Args...) : value(1)
{
cout <<"ctor unspec running\n";
}
};
class t
{
public:
t() = delete;
explicit t(int) {}
};
int main()
{
test<t> h;
}
私が作成したオブジェクト(h
)のための第二constructor
を呼び出すようにしようとしています。私はこのエラーを取得する理由を知りません。私は全体class t
private
を作ってみましたが、それはどちらかそれを修正しませんでしたC++コンストラクタSFINAE
prog.cc: In function 'int main()': prog.cc:45:13: error: call of overloaded 'test()' is ambiguous test<t> h; ^ prog.cc:25:5: note: candidate: 'test<T>::test(Args ...) [with Args = {}; T = t]' test(Args... args) ^~~~ prog.cc:19:5: note: candidate: 'test<T>::test(Args ...) [with Args = {}; <template-parameter-2-2> = t; T = t]' test(Args... args): value(args...) ^~~~
。私は
"ctor unspec running"
`すなわち、印刷を実行するための第二
constructor
をしたい、私はここで何をしないのですか?最初の
constructor
コールは
SFINAed
離れている必要があります。
t
は
default constructed
になることはできませんが、
ambiguous
コールエラーが発生するため、
typename = decltype(T())
は動作しません。
は答えてくれてありがとう。受け入れられました。 – PYA