模板函数未调用

挑衅者

我已经在字符串类中重载了一个函数,但是它从未被调用过。为什么?

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])
}
麦卡

要获得更多参考,请参考以下特定参考:

13.3.3最佳可行功能

给定这些定义,如果对于所有自变量i,ICSi(F1)的转换顺序都不比ICSi(F2)差,则将一个可行函数F1定义为比另一个可行函数F2更好的函数,然后...

  • F1不是功能模板专业化而F2是功能模板专业化...

在这种情况下,按照“标准转换序列”部分中表中定义的排名规则,非模板函数不是(显然)不是函数模板专业化,并且"Hello World"to的转换char const*不比to差const char[N]根据该表,在过载解析的情况下,两者No conversions requiredArray-to-pointer conversion都被视为完全匹配。同样,如果将模板化的重载更改为非模板的重载(即as void assign(const T(&ptr)[12]);),则str.assign("Hello World");由于模棱两可的调用而导致的编译将失败。

为了确保不考虑非模板函数的重载,在“显式模板参数规范”部分下有以下说明:

注意:空的模板参数列表可用于指示给定用途是指功能模板的特殊化,即使可见的非模板功能(8.3.5)也可以使用。

因此,您可以使用str.assign<>("Hello World");它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章