аргумент типа "const char *" несовместим с параметром типа "char" - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь создать динамическую c реализацию массива в C ++, используя указатели и шаблоны, чтобы я мог принимать все типы. Код работал с int, но использование char дает ошибку. Я пробовал в Интернете другие ТАК вопросы, но ничего не нашел о моем сценарии. Код:

#include <iostream>
#include <string>
using namespace std;

template <typename T>
class dynamicIntArray
{
private:
    T *arrPtr = new T[4]();
    int filledIndex = -1;
    int capacityIndex = 4;

public:
    // Get the size of array
    int size(void);

    // Check if array is empty
    bool isEmpty(void);

    // Insert a data to array
    bool insert(T n);

    // Show the array
    bool show(void);
};

template <typename T> 
int dynamicIntArray<T>::size(void)
{
return capacityIndex + 1;
}


template <typename T> 
bool dynamicIntArray<T>::insert(T n)
{
    if (filledIndex < capacityIndex)
    {
        arrPtr[++filledIndex] = n;
        return true;
    }
    else if (filledIndex == capacityIndex)
    {
        // Create new array of double size
        capacityIndex *= 2;
        T *newarrPtr = new T[capacityIndex]();

        // Copy old array
        for (int i = 0; i < capacityIndex; i++)
        {
            newarrPtr[i] = arrPtr[i];
        }

        // Add new data
        newarrPtr[++filledIndex] = n;
        arrPtr = newarrPtr;

        return true;
    }
    else
    {
        cout << "ERROR";
    }
    return false;
}

template <typename T> 
bool dynamicIntArray<T>::show(void)
{
    cout << "Array elements are: ";
    for (int i = 0; i <= filledIndex; i++)
    {
        cout << arrPtr[i] << " ";
    }
    cout << endl;

    return true;
}

int main()
{
    dynamicIntArray<char> myarray;

    myarray.insert("A");
    myarray.insert("Z");
    myarray.insert("F");
    myarray.insert("B");
    myarray.insert("K");
    myarray.insert("C");

    cout << "Size of my array is: " << myarray.size() << endl;

    myarray.show();
}

Ошибка:

invalid conversion from ‘const char*’ to ‘char’   

РЕДАКТИРОВАТЬ: я пытался использовать dynamicIntArray<string> myarray; на этот раз это дает ошибку сегментации.

Ответы [ 2 ]

4 голосов
/ 08 января 2020

Для начала в коде есть несколько ошибок.

Например, функция size возвращает недопустимое значение.

template <typename T> 
int dynamicIntArray<T>::size(void)
{
return capacityIndex + 1;
}

Изначально массив состоит из 4 элементов

T *arrPtr = new T[4]();
int capacityIndex = 4;

, но функция возвращает 5 (capacityIndex + 1).

В функции insert есть доступ к памяти за пределами выделенного массива. Например, когда fillIndex равен capacityIndex - 1, тогда в этом операторе if

if (filledIndex < capacityIndex)
{
    arrPtr[++filledIndex] = n;
    return true;
}

значение n записывается в позиции, равной capacityIndex, тогда как действительный диапазон индексов равен [0, capacityIndex).

В этом фрагменте кода

    capacityIndex *= 2;
    T *newarrPtr = new T[capacityIndex]();

    // Copy old array
    for (int i = 0; i < capacityIndex; i++)
    {
        newarrPtr[i] = arrPtr[i];
    }

элемент данных capacityIndex был увеличен

    capacityIndex *= 2;

Однако вы используете это новое значение в для для l oop

    for (int i = 0; i < capacityIndex; i++)
    {
        newarrPtr[i] = arrPtr[i];
    }

для копирования несуществующих элементов массива, на который указывает arrPtr.

Что касается ошибки компилятора, то в таких операторах, как этот

myarray.insert("A");

Вы используете строковые литералы. Например, строковый литерал "A" имеет тип const char[2], который в выражении аргумента преобразуется в тип const char *.

Этот указатель вы пытаетесь присвоить объекту типа char то есть объекту выделенного динамически массива с типом элемента char.

Вы должны написать как

myarray.insert( 'A' );

То есть вместо строкового литерала вы должны использовать символ литерал с типом char - тип аргумента шаблона типа.

3 голосов
/ 08 января 2020

myarray.insert("A");"A" - это const char[], но вставка ожидает char. Вы можете изменить это на myarray.insert('A')

...