ошибка C2440: «инициализация»: невозможно преобразовать из «const mynamespace :: mytype *» в «const T *» - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть эти два cpp файла. Когда я пытаюсь кодировать шаблонную функцию Method(), возникает ошибка C2440.

Я пробовал три разных способа сделать назначение. Только приведение в стиле C может пройти компилятор.

Я хочу знать, как это сделать в стиле C ++.

Спасибо:)

FileA:

template <typename T>
int ClassName<T>::Method(params...)
{
    const T* temp = (T*)GetValueArray(); // C-style cast, right √
    const T* temp = GetValueArray(); // no cast, error C2440
    const T* temp = static_cast<T*>(GetValueArray()); // error C2440, reinterpret or 
                                                      // const or dynamic_cast all C2440 
}

_______________

FileB:

typedef double mytype;

const mynamespace::mytype* GetValueArray() const
{
    mynamespace::mytype res[3] = {1,2,3};
    return res;
}

#include <iostream>

typedef double MyType;

const MyType* GetValueArray()
{
    MyType* ptr = new MyType;
    *ptr = 20.20;
    return ptr;
}

template <typename T>
void Method()
{
    const T* temp = (T*)GetValueArray(); // C-style cast, right √
    //const T* temp = GetValueArray(); // no cast, error C2440
    //const T* temp = static_cast<T*>(GetValueArray()); // error C2440, reinterpret or 
                                                      // const or dynamic_cast all C2440
    std::cout << *temp;
}

int main(int argc, char* argv[])
{
    Method<double>();
}

Я получаю вывод 20.2. Здесь я могу получить правильный результат, потому что T это просто double. В этой ситуации при потере const программа может передать компилятор.

Но если я изменю на Method<int>, неважно, какой будет результат (на самом деле результат - бесполезное число), но почему C2440 будет происходить?

1 Ответ

3 голосов
/ 22 апреля 2020

Ваш актер потерял постоянство

const T* temp = static_cast<const T*>(GetValueArray());

Причина, по которой актерский стиль C - это один из кастов , который он пробует, - const_cast, который скорее всего, не то, что вы хотите в этом случае.

...