在下面的代码中,我正在尝试搜索我传递给特定字符串的模板函数的字符串数组,但是我得到错误“没有匹配函数来调用`arraySearch”。前两个函数调用int数组和双数组工作正常,似乎我只是缺少来处理字符串数组的详细信息,我无法弄清楚它是什么。无论如何,它必须是一个数组(没有向量)。任何帮助将非常感谢!
#include<iostream>
#include<string>
using namespace std;
template<typename T>
bool arraySearch(T array[], int size, T thing)
{
for(int i = 0; i < size; i++)
{
if(array[i] == thing)
return true;
}
return false;
}
int main()
{
const int SIZE = 12;
int intArray[] = {14, 3, 6, 76, 34, 22, 21, 54, 33, 23, 76, 234};
cout << "The element was found: " << arraySearch(intArray, SIZE, 23) << endl;
double doubleArray[] = {34.5, 65.56, 11.1, 45.4, 87.5, 98.3, 23.6, 15.5, 3.3, 5.44, 54.3, 99.9};
cout << "The element was found: " << arraySearch(doubleArray, SIZE, 23.6) << endl;
string stringArray[] = {"cool", "bug", "master", "katze", "republic", "randolph", "watermelon", "igloo", "sardine", "cream", "yellow", "rubber"};
cout << "The element was found: " << arraySearch(stringArray, SIZE, "cool") << endl;
system("pause");
return 0;
}
答案 0 :(得分:4)
你需要说:
cout << "The element was found: " << arraySearch(stringArray, SIZE, std::string("cool")) << endl;
问题在于,当"cool"
将T
实例化为T
时,std::string
不是std::string
的实例。在C ++中,字符串文字是C char数组,而不是std::find
。
此外,您只需使用<algorithm>
中的std::find
即可获得与您发布的代码相同的效果。 std::string* res = std::find(stringArray, stringArray + sizeof(stringArray) / sizeof(std::string), "cool");
可以使用C数组和指针以及C ++迭代器。
{{1}}
答案 1 :(得分:3)
问题是T
从第一个参数推断为std::string
,从第二个参数推断为const char*
。
因此,编译器不知道选择哪一个。尝试做:
arraySearch(stringArray, SIZE, std::string("cool"))
或者,让函数模板接受不同类型的参数:
template<typename T, typename U>
bool arraySearch(T array[], int size, U thing)
这不需要明确构建std::string
对象:
arraySearch(stringArray, SIZE, "cool")
如果您决定采用这种方式,您可能希望进一步限制SFINAE约束您的功能模板,使其仅接受具有相等性的类型:
template<typename T, typename U,
decltype(declval<T>() == declval<U>())* = nullptr>
bool arraySearch(T array[], int size, U thing)