模板参数的C ++自动模板推导失败

一月

我想更好地了解为什么自动模板推导(使用编译时适用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 aA<> a的意思是你想的实例A使用默认的模板参数值,也就是你最终获得A< void >

该函数g< C >()接受一个模板参数,该参数恰好是一种类型,而不是另一种模板化类型。当使用调用它时A<>,您告诉编译器您要使用模板类型的“实例化”,该类型A是有效的。当您调用它时,A告诉编译器您要g< C >()使用C不适合其签名的模板化类型来调用

如果g()像这样声明/定义template <typename <typename> TTemplatedType> g(),它将接受这样的调用,g< A >()g< A<> >()会失败,因为现在它不再需要除模板类型之外的其他内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章