#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
。但是我不知道为什么会出现这个错误:
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...)
^~~~
我试图将整个 class t
改为 private
,但这也无法解决问题。我希望第二个 constructor
能够运行,即打印出
"ctor unspec running"
我在这里缺少什么?第一个 constructor
的调用应该被 SFINAed
掉,因为 typename = decltype(T())
不起作用,因为 t
无法进行 default constructed
但是我得到了一个 ambiguous
的调用错误。