c++ - 默认模板参数可以对应于特化吗?

标签 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();
}

我收到错误:在“b”之前缺少模板参数。预先感谢您花时间阅读本文! :)

最佳答案

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

Bird<> b;

关于c++ - 默认模板参数可以对应于特化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16305665/

相关文章:

c++ - 如何在 for 循环中记录输入?

c++ - 无法通过进位传播值(value)

c++ - 根据类创建时的模板参数更改类 API

C++ - 具有 volatile 变量的模板函数 - 无法调用模板特化

c++ - () 仿函数后的括号而不是函数指针?

c++ - 抽象类和纯方法 C++

c++ - 编译模板类因 g++ 或 clang++ 失败

c++ - RAII 和推导的模板参数

c++ - 在 C++ 中专门化函数时调用函数的非专门化版本?

c++ - GNU Make 因 If 语句中的语法错误而退出