所以,我正在为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";
}
}
}
而且,这是我在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 *')
现在,我已经用整数,浮点数,双精度等测试了这个函数,它运行良好的那些类型,这意味着我的模板工作(对于这些类型)。这让我想知道为什么当函数清楚地知道我传递的字符串类型的deque而不是类型为const char *时,我会收到此错误。任何帮助都会很棒。谢谢!
答案 0 :(得分:10)
要修复您的函数以允许隐式转换,请确保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 *
进行隐式转换1}}。
答案 1 :(得分:4)
好吧,std::string
和const char*
(&lt; - 这是"pear"
在调用函数时衰减的内容)是两种不同的类型,你们都希望从中推断T
就像编译器说的那样。
要解决此问题,请使用正确的类型调用该函数:
searchInDequeFor(myDeque,std::string("pear"));