为什么c++标准不允许函数模板部分特化
Why does the C++ standard not allow function template partial specialization?
我读到一些可能会让编译器感到困惑的东西
template <class T>
void calculator<std::complex<T>>::myMin();
但也许只是给它一个这样的提示?为了明确它是部分专门化。
template < , class T>
void calculator<std::complex<T>>::myMin();
来自@danh在上面评论中链接的http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#229:
10/00会议记录:
函数模板部分专门化的一个主要问题是函数模板可以被重载,这与类模板不同。简单地在特化中命名函数模板,就像在类特化中所做的那样,不足以识别被特化的模板。
为什么c++标准不允许函数模板部分特化?
因为,反过来想,如果标准允许模板函数部分专门化会发生什么?
假设这个简单的例子允许模板函数的部分特化:
template<class T> void f( T ) { print("A-overload") };
template<class T> void f( T* ){ print("B-overload") };
// template<class T> void f(T*) { print("A-partial-specialization") };
你现在能区分b -重载和A的部分专门化吗?你确实不能!
此外,假设您有另一个重载,它从重载a或重载b获取T**
和具有完全相同签名的部分专门化,您将怎么办?一般来说,部分特化的概念只存在于类模板(见§14.5.5)和成员模板(即模板类的成员本身就是模板函数,见§14.5.5.3/2)中。它不存在于类模板的普通成员中,也不存在于函数模板中——仅仅是因为它没有在标准中描述。
相关文章:
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- error dllimport 函数的定义不允许在一个特定的联合中,而其他类、结构和联合将按预期导出
- 为什么C++不允许两个同名的函数/类模板,区别仅在于非类型模板参数(整型)的类型?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- C++:为什么允许在另一个函数中声明函数,而不允许在函数定义中声明?
- 函数模板和不明确的模板参数
- 如何编写模板重载函数,并在模板参数不允许实例化某个类时触发回退
- 模板函数调用中C++错误:不允许使用类型名称
- 类模板的成员函数模板找不到定义,尽管存在显式实例化。不链接
- 为什么不允许对成员函数的模板专业化
- 为什么C 不允许在非模板函数中进行变异参数
- 为什么函数作用域不允许类前向声明?
- 函数模板返回不完整的值
- 是否可以使函数模板对不适当的类型而不是错误执行默认操作
- 如果对象没有默认构造函数,并且不允许在其类定义中创建一个,那么如何将对象放入节点中?
- 为什么模板模板参数不允许在参数列表后使用"typename"
- 使用函数模板而不是通用 lambda 时
- 为什么标准容器使用函数模板而不是非模板Koenig操作符
- 模板头不允许我使用我的类