3

考虑这些都在类声明中:

template<class V>
bool tryGetValue(const string &key,V& value) const { ... }
bool tryGetValue(const string &key,bool& value) const { ... }

编译器会在这里做什么?

4

3 回答 3

1

编译器将尽可能选择专用版本。

于 2013-09-19T15:51:21.610 回答
1

它将更喜欢非模板方法。

从 14.8.3 开始:

另请注意,13.3.3 指定非模板函数将优先于模板特化,如果这两个函数在其他方面同样适合重载匹配。

以及 13.3.3 的一部分:

鉴于这些定义,如果对于所有参数 i,ICSi(F1) 不是比 ICSi(F2) 更差的转换序列,则可行函数 F1 被定义为比另一个可行函数 F2 更好的函数,然后

(...)

  • F1 是非模板函数,F2 是函数模板特化,或者,如果不是,

(...)

于 2013-09-19T15:52:07.617 回答
0

编译将选择最佳匹配的重载。

template<class V>
bool tryGetValue(const std::string &key,V& value) {
    return false;
}

// Overload (no specilaization)
bool tryGetValue(const std::string &key,bool& value) {
    return true;
}

int main()
{
    std::string s = "Hello";
    int i = 1;
    bool b = true;
    std::cout
        << "Template: "
        << ((tryGetValue(s, i) == false) ? "Success" : "Failure") << std::endl;
    std::cout
        << "No Template: " << (tryGetValue(s, b) ? "Success" : "Failure") << std::endl;
    return 0;
}
于 2013-09-19T15:59:14.750 回答