为什么我的 C++ 函数模板特化没有被调用?

问题描述 投票:0回答:1

我有以下代码:

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 运行来测试它,但测试后,我发现专业化没有被调用。它调用主模板。我不明白为什么。

c++ function templates character specialization
1个回答
10
投票

当主模板中的类型模板参数

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));
}
© www.soinside.com 2019 - 2024. All rights reserved.