默认模板实参可以对应于特化吗?
Can a Default Template Argument correspond to a 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
是一个类模板,所以你总是必须使用尖括号。与函数模板不同的是,如果你想使用默认的模板参数,你可以省略它们,但是尖括号必须在那里:
Bird<> b;
相关文章:
- GCC/CLang不同意模板模板参数的部分特化
- g++ 7.1.1 中的可变参数模板部分特化"not more specialised"
- C++ 部分特化不适用于不同大小的特征矩阵
- 如何转发声明依赖于变量定义的类,而变体定义又依赖于模板化类?
- 检测<T>某些非数字类型 T 的 std::numeric::type 的特化
- 如何确保 "<<" 运算符适用于模板化 ADT 定义中的任何泛型类型?
- C++模板部分特化:为什么我无法匹配可变参数模板中的最后一个类型
- 在 c++-17 中特化的模式匹配中 lambda 的拆分函数签名
- C++ 如何根据部分特化制作 std::元组类型?
- 积分常量与 A 类型的部分特化
- 整型非类型参数和非整型非类型参数的模板部分特化,g++和clang的区别
- 标准特化不应该是std::atomic缺乏值构造函数吗
- 疯狂的谈话(偏执于初始化)
- 通过类的模板形参特化成员模板结构
- 当实参是初始化列表而形参是引用时,重载解析
- 将操作符转换为模板实参的特化
- 类模板特化,c++,模板形参列表中参数2不匹配
- 默认模板实参可以对应于特化吗?
- 如何在c++函数模板中指定默认的非模板实参初始化式
- vc++函数模板实例化错误C2664当使用不同的枚举实参时