私は次のコードを持っています:
template<typename T>
bool validate(const T& minimum, const T& maximum, const T& testValue)
{
return testValue >= minimum && testValue <= maximum;
}
template<>
bool validate<const char&>(const char& minimum, const char& maximum, const char& testValue)
{
// Allows comparisons with char arguments, ignoring case
// Localize by calling previously defined function
return validate(toupper(minimum), toupper(maximum), toupper(testValue));
}
最初のテンプレートは入力されたタイプに使用され、特殊化はリテラル文字用です。コードはコンパイルされ、main.cppで実行されてテストされますが、テストした後、特殊化が呼び出されていないことがわかりました。メインテンプレートを呼び出します。理由がわかりません。
template <> bool validate<const char&>
型テンプレートパラメータ際分業は、コンパイラによって捕捉されるT
主なテンプレートからは推測またはであることを明示的に指定されていますconst char&
。呼び出しのvalidate('a', 'b', 'c')
場合、T
はであると推定されchar
、これはスペシャライゼーションが期待するものと一致しません。
特殊化を提供するchar
(つまり、ではないconst char&
):
template <>
bool validate<char>(const char& minimum, const char& maximum, const char& testValue)
{
return validate(toupper(minimum), toupper(maximum), toupper(testValue));
}
または、オーバーロードを非テンプレートとして定義します。
bool validate(char minimum, char maximum, char testValue)
{
return validate(toupper(minimum), toupper(maximum), toupper(testValue));
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加