代码之家  ›  专栏  ›  技术社区  ›  Rick Jim DeLaHunt

模板专用化不匹配错误

c++
  •  4
  • Rick Jim DeLaHunt  · 技术社区  · 7 年前

    重新编辑:

    C++引物第五

    版本1:

    template <typename T> int compare(const T&, const T&);

    版本2:

    template<size_t N, size_t M> int compare(const char (&)[N], const char (&)[M]);

    版本1的特殊化:

    template <> int compare(const char* const &p1, const char* const &p2);

    例如,我们定义了 两个版本 compare 函数模板, 另一个需要 const T& 也有一个专门的字符指针 compare("hi", "mom") 两个函数模板都是可行的,并且提供了与调用相同的良好匹配(即精确匹配)。 字符数组参数


    这本书说“两者都提供了一个同样好的匹配”,所以我认为把版本1和它的专门化应该编译得很好。但事实并非如此。

    所以“提供同样好的匹配”并不意味着它可以编译?这本书捉弄了我?

    我不明白为什么不能编译的原始代码段链接: https://wandbox.org/permlink/oSCDWad03nELC9xs


    完整的背景截图(我已经框了最相关的部分,很抱歉在这里张贴这么大的图片)。

    enter image description here enter image description here

    3 回复  |  直到 5 年前
        1
  •  2
  •   NathanOliver    7 年前

    C样式的字符串不是指针,而是数组。当模板类型演绎发生时,它会演绎 T 作为其中之一 const char[3] const char[4] . 由于这些冲突,编译器无法推断 T型 它就停在那里。

    template<>
    int compare(const char* const &p1, const char* const&p2) {
        cout << "const char* const" << endl;
        return 3;
    }
    

    演绎与匹配 const char* 编译器无法推断 T型 . 如果 T型

    如果要重载函数而不是提供专门化 then it would compile 使用:

    int compare(const char* const &p1, const char* const&p2) {
        cout << "const char* const" << endl;
        return 3;
    }
    
        2
  •  2
  •   Paolo M    7 年前

    不同类型 (类型) "hi" const char [3] 以及 "mom" const char [4] ),因此编译器无法找到 T

    这和你得到的电话号码是一样的错误 std::min(0, 1U) std::min() (其中一个重载)需要两个参数 compare() 函数不起作用。

    可能的 解决方案 问题的关键是接受不同类型的参数:

    template <typename T1, typename T2>
    int compare(const T1&, const T2&);
    

        3
  •  0
  •   Shrikanth N    7 年前

    编译器无法将其与现有模板之一匹配。如果您仔细阅读第16.5节,您将理解它将调用template类的第二个版本。

    const char[3] const char [4] 编译器找不到以两种不同数据类型作为参数的模板专用化。 下面的代码是解决方案之一。

    #include <iostream>
    #include <string>
    using namespace std;
    
    template <typename T> int compare(const T&, const T&) {
      cout << "const T" << endl;
      return 3;
    }
    
    template<size_t N, size_t M>
    int compare(const char (&p)[N], const char (&q)[M]) {   
       cout<<p<<" "<<q<<endl;
       return 3;
    }
    
    int main()
    {
       compare("hi", "mom");
    } 
    

    另一种解决方案如下。它采用两种不同的类型并访问变量。

    #include <iostream>
    #include <string>
    using namespace std;
    
    template <typename T> int compare(const T&, const T&) {
       cout << "const T" << endl;
       return 3;
    }
    
    template <typename T1, typename T2>
    int compare(const T1&p, const T2&q){   
       cout<<p<<" "<<q<<endl;
       return 3;
    }
    
    int main()
    {
       compare("hi", "mom");
    }