【问题标题】:Can a Default Template Argument correspond to a Specialization?默认模板参数可以对应于专业化吗?
【发布时间】:2013-04-30 17:28:33
【问题描述】:

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

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

我做错了什么?


案例 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”之前缺少模板参数。提前感谢您抽出宝贵时间阅读本文! :)

【问题讨论】:

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


    【解决方案1】:

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

    Bird<> b;
    

    【讨论】:

    • 感谢您的快速回答,我现在觉得自己很愚蠢。我首先做这一切的原因是为了在我的程序中允许“空模板”用于一个特定案例,但我想我不能让代码看起来比这更好:(还是谢谢!
    • @Sh3ljohn: 不幸的是你不能:(祝你的项目好运:)
    • @Sh3ljohn 你总是可以创建像typedef Bird&lt;&gt; DefaultBird; 这样的typedef。显然,typedef 必须有一个不同的名称,所以,它不是很好,但也许它可以为你工作。
    • @MikaelPersson 我的“程序”实际上是一个非常小的库,所以我认为如果我声明一个不同名称的类型可能会让用户感到困惑,但非常感谢您的建议!
    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多