Как мне сохранить строки (или любой тип) в массиве типа T? - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь сохранить строку (или любой тип) внутри массива типа T, но получаю две ошибки:

ссылка типа "std :: string &" ( не соответствует const) не может быть инициализирован значением типа "const char [3]"

'bool container :: insertBack (T &)': невозможно преобразовать аргумент 1 из 'const char [3]' на 'T &'

Я попытался изменить тип на int вместо строки: я получил похожие сообщения об ошибках.

#include <iostream>
#include <string>

template<typename T>
class container
{
public:
    container();
    // Postcondition: data member n is initialized to -1 and all elements in the empty arr array are initialized to zero
    bool isFull();
    // Postcondition: returns true if the container object (i.e., the arr array) is full; returns false otherwise
    bool insertBack(T& val);
    //  Precondition: the container object is not full
    // Postcondition: if arr array is not full, n is incremented by 1; returns true with val is inserted at the end of the arr array 
    //                 Otherwise, returns false; the value is not inserted and program execution continues.
private:
    static const int CAPACITY = 10;     // physical size of the arr array or the storage capacity of a container object
    T arr[CAPACITY];            // arr array can store up to CAPACITY  (10 in our case) of any type 
    int n;                      // n is used as the subscript for the arr array. n is initialized to -1 for an empty array
                                // Each time a new value is inserted into the arr array, n must first be incremented 
                                // by 1. Since n has been initialized to -1, the first inserted value is stored in arr[0],
                                // and the 2nd inserted value will be in arr[1], etc.  and the nth inserted value will be 
                                // stored in arr[n – 1]. Obviously, n + 1 represents the actual number of elements
                                // stored in the array after n rounds of insertion.         
};

template<typename T>
container<T>::container()
{
    n = -1;
    T arr[CAPACITY] = { 0 };
}

template<typename T>
bool container<T>::isFull()
{
    return n == CAPACITY - 1;
}

template<typename T>
bool container<T>::insertBack(T& val)
{
    if (!isFull())
    {
        n++;
        arr[n - 1] = val;
        return 1;
    }
    else
    {
        return 0;
    }
}

int main()
{
    container<std::string> s1;
    s1.insertBack("aa");
}

1 Ответ

1 голос
/ 29 февраля 2020

g++ дает немного другой вывод для той же ошибки:

cannot bind non-const lvalue reference of type 'std::__cxx11::basic_string<char>&' to an rvalue of type 'std::__cxx11::basic_string<char>'

clang++:

non-const lvalue reference to type 'std::__cxx11::basic_string<char>' cannot bind to a value of unrelated type 'const char [3]'

Решение состоит в том, чтобы принять аргумент как const&.

Далее вы обнаружите, что T arr[CAPACITY] = { 0 };
дает исключение времени выполнения, подобное : basic_string::_M_construct null not valid.

Вы не ноль, инициализирующий arr таким образом. Фактически, вы создаете новый arr и пытаетесь создать его с помощью nullptr, который не будет работать для std::string[].

Вы можете также использовать целое число без знака как size_t для подсчета элементы как стандартные контейнеры, чтобы облегчить будущие взаимодействия со стандартными функциями / алгоритмами.

С этим исправлено: *

#include <iostream>
#include <string>

template<typename T, size_t Capacity = 10>       // made the capacity selectable
class container {
public:
    container() : arr{}, n(0) {}                 // using member initializer list

    bool isFull() const { return n == Capacity; } // correct test with a 0 based counter

    bool insertBack(const T& val) {               // const
        if (isFull()) return false;
        // return true or false, not 1 or 0 
        arr[n++] = val;
        return true;
    }

private:
    T arr[Capacity];
    size_t n;
};

int main() {
    container<std::string> s1;
    s1.insertBack("aa");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...