C++错误:推导出参数'T'字符串与const char*的冲突类型

bus*_*d12 4 c++ string templates char c++11

所以,我正在为deque容器编写一个简单的模板化搜索函数.这是代码:

    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";
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

        deque<string> myDeque={"apple", "banana", "pear", "blueberry"};
        searchInDequeFor(myDeque,"pear");
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

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

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

小智 10

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

template <typename T>
struct identity { typedef T type; };

template <typename T>
void searchInDequeFor(std::deque<T> Deque, typename identity<T>::type searchValue)
Run Code Online (Sandbox Code Playgroud)

这样,当你传入a std::deque<std::string>和a时const char *,编译器只能使用第一个参数来确定T使用哪个.只有在 T修复后std::string才能解析第二个参数的类型,因为std::string这将允许隐式转换const char *.


Bau*_*gen 5

好了,std::string并且const char*(<-这是"pear"调用函数时衰减的原因)是您都想从中T得出的两种不同类型,就像编译器所说的那样。

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

searchInDequeFor(myDeque,std::string("pear"));
Run Code Online (Sandbox Code Playgroud)