C ++ Float и String типы данных не могут быть вставлены в шаблонную функцию - PullRequest
0 голосов
/ 01 ноября 2018

У меня в коде ошибка, которая говорит, что типы данных с плавающей запятой и строковые значения не являются правильными вызовами функций для моей функции шаблона. Функция шаблона работает для int и char, но не для float и string. Я посмотрел, есть ли ошибки в определениях функций, но я не смог их увидеть. Может кто-нибудь объяснить или предложить, в чем может быть проблема?

search.h

#ifndef Search_hpp
#define Search_hpp
#include <iostream>
#include <stdio.h>
using namespace std;
class Search{
private:
public:
    template<typename ST>
    ST LinearSearch(ST numbers[], int listSize, ST key);
    template<typename ST>
    ST BinarySearch(ST numbers[], int listSize, ST key);
};

#endif /* Search_hpp */

Search.cpp

#include "Search.h"
#include <iostream>
#include <string>
using namespace std;
template<typename ST>
ST Search::LinearSearch(ST numbers[], int listSize, ST key){
    int i;

    for (i = 0; i < listSize; ++i) {
        if (numbers[i] == key) {
            return i;
        }
    }

    return -1; /* not found */
}
template<typename ST>
ST Search::BinarySearch(ST numbers[], int listSize, ST key){
    int mid;
    int low;
    int high;

    low = 0;
    high = listSize - 1;

    while (high >= low) {
        mid = (high + low) / 2;
        if (numbers[mid] < key) {
            low = mid + 1;
        }
        else if (numbers[mid] > key) {
            high = mid - 1;
        }
        else {
            return mid;
        }
    }

    return -1; // not found

}

main.cpp

#include "Search.h"
#include <iostream>
#include <string>
using namespace std;

int main() {
    int integerlist[] = {-1, 1, 5, 7, 8};
    float floatlist[] = {0.3338, 0.5, 2.5, 7.2, 9.6};
    string stringlist[] = {"anteater", "cat", "giraffe", "lion", "octopus"};
    char charlist[] = {'a', 'b', 'i', 'l', 'o' };
    const int size = 5;
    Search SearchClass;
    SearchClass.LinearSearch(integerlist, size, 12);
    SearchClass.BinarySearch(integerlist, size, 12);
    SearchClass.LinearSearch(floatlist, size, 6.543);
    SearchClass.BinarySearch(floatlist, size, 6.543);
    SearchClass.LinearSearch(stringlist, size, "lion");
    SearchClass.BinarySearch(stringlist, size, "lion");
    SearchClass.LinearSearch(charlist, size, 'o');
    SearchClass.BinarySearch(charlist, size, 'o');
};

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

LinearSearch невозможно найти из-за неоднозначности в выводе типа для параметра шаблона ST

В

SearchClass.LinearSearch(floatlist, size, 6.543);

type float выведено для ST из floatlist, но double выведено из 6.543

Решение:

SearchClass.LinearSearch(floatlist, size, 6.543F);
                                               ^
                                        change made here

для силы float для обоих.

SearchClass.LinearSearch(stringlist, size, "lion");

похоже. string выводится из stringlist, но "lion" является const char[5]

SearchClass.LinearSearch(stringlist, size, string("lion"));

решает это путем преобразования "lion" в string.

К сожалению, тогда LinearSearch пытается вернуть индекс найденного элемента (или -1, если не найден) как string. Как подсказывает для ответа , возвращать string для индекса довольно глупо, как и возвращать что угодно, кроме целочисленного типа.

int Search::LinearSearch(ST numbers[], int listSize, ST key)

кажется более подходящим.

Дополнительные примечания:

Trass3r поднимает очень важный момент в комментариях. Шаблоны могут быть реализованы только в заголовочном файле.

Магическое число 5 в

const int size = 5;

можно заменить на

SearchClass.LinearSearch(integerlist, size(integerlist), 12);

по состоянию на C ++ 17. Документация по std :: size .

0 голосов
/ 01 ноября 2018

Проблема в том, что функции вашего шаблона объявлены так, что они возвращают указанный тип, но если он не найден, он возвращает -1. -1 не является строковым значением, поэтому код завершается ошибкой. Решением было бы изменить тип возвращаемого значения на size_t или аналогичный, поскольку вы будете возвращать только индексы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...