C++ 错误 : deduced conflicting types for parameter 'T' string vs const char *

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

因此,我正在为双端队列容器编写一个简单的模板化搜索函数。这是代码:

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

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

最佳答案

要修复您的函数以允许隐式转换,请确保 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 * 进行隐式转换.

关于C++ 错误 : deduced conflicting types for parameter 'T' string vs const char *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30835980/

相关文章:

c++ - 为什么模板只能在头文件中实现?

c++ - UINT GetDriveTypeA(LPCSTR )': cannot convert argument 1 from ' LPCWSTR' 到 'LPCSTR' ?

c++ - 三法则与继承

c++ - 如何制作指向另一个子 vector 中项目的指针 vector ?

C# 如何在字符串中写行特定字符串?

class - 根据一台机器上安装的类选择 puppet 模板

c++ - 演绎指南、模板和子对象 : which compiler is right?

c++ - 从一个类调用另一个类的成员函数

c++ - 什么是单次 dispatch 和双重 dispatch ?

PHP array_key_exists key LIKE 字符串,这可能吗?