C++错误:推导出的参数'T'的类型冲突,字符串与常量字符指针。

6

因此,我正在为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";
            }
        }
    }

这里是我在主函数中调用该函数的方法:

        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 *')

现在,我已经测试了这个函数的整数、浮点数、双精度等类型,并且对于这些类型它可以正常运行,这意味着我的模板正在工作。但是,让我感到困惑的是,为什么当函数明显知道我传入的是字符串类型的 deque 而不是 const char * 类型时,我还是会遇到这个错误。任何帮助都将是非常棒的。谢谢!

2个回答

12
为了修复您的函数以允许隐式转换,请确保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<std::string>和一个const char *时,编译器只能使用第一个参数来确定使用哪个T。仅在将T确定为std::string后,第二个参数的类型才能被解析为std::string,并且这将允许从const char *进行隐式转换。


这非常棒!谢谢! - busebd12

6

好的,std :: stringconst char * (< - 这是调用函数时"pear"所退化的类型)是两种不同的类型,您都想从中推断出T,就像编译器所说的那样。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接