これらは両方ともクラス宣言内にあると考えてください。
template<class V>
bool tryGetValue(const string &key,V& value) const { ... }
bool tryGetValue(const string &key,bool& value) const { ... }
コンパイラはここで何をしますか?
これらは両方ともクラス宣言内にあると考えてください。
template<class V>
bool tryGetValue(const string &key,V& value) const { ... }
bool tryGetValue(const string &key,bool& value) const { ... }
コンパイラはここで何をしますか?
テンプレートを使用しない方法が優先されます。
14.8.3 以降:
また、13.3.3 では、2 つの関数が過負荷一致の候補として同等に適している場合、テンプレートの特殊化よりも非テンプレート関数が優先されることが指定されていることにも注意してください。
そして13.3.3の一部:
これらの定義が与えられた場合、実行可能な関数 F1 は、すべての引数 i について、ICSi(F1) が ICSi(F2) よりも悪い変換シーケンスではない場合、別の実行可能な関数 F2 よりも優れた関数であると定義されます。
(...)
- F1 は非テンプレート関数で、F2 は関数テンプレートの特殊化です。そうでない場合は、
(...)
コンパイルは、最適なオーバーロードを選択します。
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;
}