没有调用模板化的功能

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)

mka*_*kal 6

有关更多参考,标准的一些具体参考是:

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");它.

  • 我仍然试图将这与以下事实相协调:StringT <char> str; char hw_array [] ="Hello World"; str.assign(hw_array); 调用模板版本 (2认同)