默认模板参数是否可以与专业化相对应?

时间:2013-04-30 17:28:33

标签: c++ templates template-specialization partial-specialization

嗨:)我已经查看了这个问题并且似乎有很多相关的帖子,但到目前为止没有一个答案可以解决我的问题。如果您知道回复此特定问题的帖子,请告诉我哪一个,我将删除此帖子。

这是我想要做的事情;我有一个带有一个模板参数的类,其默认值对应于模板特化。到目前为止(见下面的代码),它没有编译。让我感到困惑的是,使用两个模板参数的类似情况,以及部分模板特化编译并且工作正常..:/

我做错了什么?


案例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();
}

我收到错误:在&#39; b&#39; 之前缺少模板参数。提前感谢您花时间阅读本文! :)

1 个答案:

答案 0 :(得分:4)

Bird模板,因此您必须始终使用尖括号。与 function 模板不同,如果您想使用默认模板参数,可以省略它们,但尖括号必须在那里:

Bird<> b;