Phi*_*tor 6 c++ templates overloading
我在我的字符串类中重载了一个函数,然而,它永远不会被调用.为什么?
template <class T>
class StringT {
public:
void assign(const T* ptr);
template <size_t N> void assign(const T(&ptr)[N]);
};
int main() {
StringT<char> str;
str.assign("Hello World"); //calls "void assign(const T* ptr)" although type is (const char[12])
}
Run Code Online (Sandbox Code Playgroud)
有关更多参考,标准的一些具体参考是:
13.3.3最佳可行功能
给定这些定义,如果对于所有参数i,ICSi(F1)不是比ICSi(F2)更差的转换序列,则可行函数F1被定义为比另一个可行函数F2更好的函数,然后......
- F1不是功能模板专业化,F2是功能模板专业化...
在这种情况下,根据"标准转换序列"部分中表格中定义的排名规则,非模板化函数(显然)不是函数模板特化,并且"Hello World"to 的转换char const*不比to更差const char[N].根据该表,既No conversions required和Array-to-pointer conversion被认为是重载的情况下精确匹配.同样,如果模板化的重载更改为非模板重载(即as void assign(const T(&ptr)[12]);),则str.assign("Hello World");由于调用模糊,编译将失败.
为了确保不考虑非模板函数的重载,在"显式模板参数规范"部分下面有以下注释:
注意:空模板参数列表可用于指示给定用途是指函数模板的特化,即使非模板函数(8.3.5)是可见的否则将被使用.
所以,你可以用str.assign<>("Hello World");它.