代码之家  ›  专栏  ›  技术社区  ›  Matt Welke

C++-未调用函数模板专用化

  •  4
  • Matt Welke  · 技术社区  · 11 年前

    我有以下代码:

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

    1 回复  |  直到 11 年前
        1
  •  10
  •   Piotr Skotnicki    11 年前

    这个 template <> bool validate<const char&> 当类型模板参数时,编译器选择专用化 T 从主模板推导或明确指定为 const char& 。打电话 validate('a', 'b', 'c') , T 推断为 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));
    }
    
    推荐文章