我想更好地了解为什么自动模板推导(使用编译时适用g++ -std=c++17
)在的前三行中起作用main()
,而在第四行中却失败。是否有机会在不久的将来被编译器接受?
template <typename P = void>
class A {
public:
void f1() {}
};
template<typename C>
void g() {}
int main() {
A<> a; // works
A aa; // works
g<A<>>(); // works
g<A>(); // fails
return 0;
}
这只是签名问题。基本上,您传递的是错误的类型。
这两个A a
和A<> a
的意思是你想的实例A
使用默认的模板参数值,也就是你最终获得A< void >
。
该函数g< C >()
接受一个模板参数,该参数恰好是一种类型,而不是另一种模板化类型。当使用调用它时A<>
,您告诉编译器您要使用模板类型的“实例化”,该类型A
是有效的。当您调用它时,A
告诉编译器您要g< C >()
使用C
不适合其签名的模板化类型来调用。
如果g()
像这样声明/定义template <typename <typename> TTemplatedType> g()
,它将接受这样的调用,g< A >()
但g< A<> >()
会失败,因为现在它不再需要除模板类型之外的其他内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句