为什么c++标准不允许函数模板部分特化

Why does the C++ standard not allow function template partial specialization?

本文关键字:函数模板部 不允许 c++ 标准 为什么      更新时间:2023-10-16

我读到一些可能会让编译器感到困惑的东西

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)中。它不存在于类模板的普通成员中,也不存在于函数模板中——仅仅是因为它没有在标准中描述。

相关文章: