默认模板实参可以对应于特化吗?

Can a Default Template Argument correspond to a Specialization?

本文关键字:于特化 实参 默认      更新时间:2023-10-16

嗨:)我已经环顾四周关于这个问题,似乎有很多相关的帖子,但到目前为止没有一个答案可以解决我的问题。如果你知道有一篇文章回答了这个问题,请告诉我是哪一篇,我会删除这篇文章。

这就是我要做的;我有一个具有一个模板参数的类,其默认值对应于模板专门化。到目前为止(请参阅下面的代码),它无法编译。让我感到困扰的是,类似的两个模板参数的情况,以及部分模板特化的编译和工作都很好。:/

我做错了什么?


案例1:两个模板参数(编译和工作)

#include <iostream>
struct Special {};
template <class T, class U = Special>
class Bird
{
public:
    inline void operator() () { sing(); }
    inline void sing() const { std::cout << "Piu piu piu" << std::endl; }
private:
    T t; U u;
};
template <class T>
class Bird<T,Special>
{
public:
    inline void operator() () {}
private:
    T t; Special u;
};

cpp

int main()
{
    Bird<double,int> a;
    Bird<double> b;
    a(); b();
}

案例2:一个模板实参(不编译)

#include <iostream>
struct Special {};
template <class U = Special>
class Bird
{
public:
    inline void operator() () { sing(); }
    inline void sing() const { std::cout << "Piu piu piu" << std::endl; }
private:
    U u;
};
template <>
class Bird<Special>
{
public:
    inline void operator() () {}
private:
    Special u;
};

cpp

int main()
{
    Bird<int> a;
    Bird b;
    a(); b();
}

我得到一个错误:在'b'之前缺少模板参数。提前感谢你花时间阅读这篇文章!:)

Bird是一个模板,所以你总是必须使用尖括号。与函数模板不同的是,如果你想使用默认的模板参数,你可以省略它们,但是尖括号必须在那里:

Bird<> b;