【问题标题】:C++ error: deduced conflicting types for parameter 'T' string vs const char *C++ 错误:推断参数“T”字符串与 const char * 的冲突类型
【发布时间】:2015-08-30 09:45:06
【问题描述】:

所以,我正在为双端队列容器编写一个简单的模板化搜索函数。代码如下:

    template <typename T>
    void searchInDequeFor(std::deque<T> Deque, T searchValue)
    {
        for(const auto & element : Deque)
        {
            if(Deque.empty())
            {
                std::cout << "Deque is empty, nothing to search for..." << "\n";
            }
            else if(element==searchValue)
            {
                std::cout << searchValue << " matches " << element << ", an element in the deque" << "\n";
            }
        }
    }

而且,这是我在 main 中调用函数的方式:

        deque<string> myDeque={"apple", "banana", "pear", "blueberry"};
        searchInDequeFor(myDeque,"pear");

这是我得到的错误:

candidate template ignored: deduced conflicting types for parameter 'T' ('std::__1::basic_string<char>' vs. 'const char *')

现在,我已经用整数、浮点数、双精度数等测试了这个函数,它在这些类型上运行良好,这意味着我的模板正在工作(对于这些类型)。这让我想知道为什么当函数清楚地知道我传入的是字符串类型而不是 const char * 类型的双端队列时,为什么会出现此错误。任何帮助都会很棒。谢谢!

【问题讨论】:

    标签: c++ string templates c++11 char


    【解决方案1】:

    要修复您的函数以允许隐式转换,请确保 T 仅从第一个参数推导出来,而不是从第二个参数推导出来。

    template <typename T>
    struct identity { typedef T type; };
    
    template <typename T>
    void searchInDequeFor(std::deque<T> Deque, typename identity<T>::type searchValue)
    

    这样,当您传入std::deque&lt;std::string&gt;const char * 时,编译器将只能使用第一个参数来确定要使用哪个T。只有在T 被固定为std::string 之后 才能将第二个参数的类型解析为std::string,这将允许从const char * 进行隐式转换。

    【讨论】:

    • 这很甜蜜!谢谢!
    【解决方案2】:

    好吧,正如编译器所说,std::stringconst char*("pear" 在调用函数时衰减到的)是两种不同的类型,您都想从中推断出 T

    要解决此问题,请使用正确的类型调用函数:

    searchInDequeFor(myDeque,std::string("pear"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      相关资源
      最近更新 更多