2

在下面的代码中,我试图搜索传递给特定字符串的模板函数的字符串数组,但我收到错误“没有匹配函数调用 `arraySearch”。前两个函数调用 int 数组和 double 数组工作正常,似乎我只是缺少处理字符串数组的细节,我不知道它是什么。无论如何,它必须是一个数组(没有向量)。任何帮助将不胜感激!

#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;
}    
4

2 回答 2

4

你需要说:

cout << "The element was found: " << arraySearch(stringArray, SIZE, std::string("cool")) << endl;

问题在于,这"cool"不是使用asT实例化模板时的实例。在 C++ 中,字符串文字是 C 字符数组,而不是.Tstd::stringstd::string


此外,您可以简单地使用std::findfrom<algorithm>来实现与您发布的代码相同的效果。 std::find可以使用 C 数组和指针以及 C++ 迭代器。

std::string* res = std::find(stringArray, stringArray + sizeof(stringArray) / sizeof(std::string), "cool");
于 2013-04-21T18:54:37.737 回答
3

问题是从第一个论点和第二个论点T推导出来。std::stringconst 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)
于 2013-04-21T18:55:06.027 回答