steffi123 Ответов: 3

Типизация ссылок и указателей в C++


Я могу продолжать относиться ведения вектор&ЛТ;недействительным*>, Чтобы ссылка на вектор&ЛТ;Фу*&ГТ; а я не могу относиться вектор&ЛТ;недействительным*>, Чтобы вектор&ЛТ;Фу*&ГТ;. Я получаю следующую ошибку: ошибка c2440: 'оператора reinterpret_cast' : не удается конвертировать из 'СТД::вектор&ЛТ;_Ty&ГТ;' на 'СТД::вектор&ЛТ;_Ty&ГТ;' зачем?

И я могу набирать void* в Foo*, не получая ошибки компилятора.
void* g =&foo;
reportFooVector2(reinterpret_cast<Foo*>(g));


Ниже приведен весь мой код.

#include "stdafx.h"
struct Foo
{
  string s;
  int i;
};


void reportFooVector( vector <Foo*> * pvf )
{
 
}


void reportFooVector1( vector <Foo*> pvf )
{
}

void reportFooVector2( Foo *pvf )
{
}


int main()
{
	struct Foo foo = {"foo",  5};
	struct Foo goo = {"goo", 10};
	void* g =&foo;
	reportFooVector2(reinterpret_cast<Foo*>(g));
	vector <void *> vf;
	vf.push_back(&foo);
	vf.push_back(&goo);
	reportFooVector1( reinterpret_cast< vector < Foo * >  >(vf));
	reportFooVector( reinterpret_cast< vector < Foo * > * >(&vf));
}

В этой программе я получаю сообщение об ошибке компилятора ошибка c2440: 'оператора reinterpret_cast' : не удается конвертировать из 'СТД::вектор&ЛТ;_Ty&ГТ;' на 'СТД::вектор&ЛТ;_Ty&ГТ;' при вызове строки reportFooVector1( оператора reinterpret_cast&ЛТ; вектор &ЛТ; Фу * &ГТ; &ГТ;(В. Ф.));

Не могли бы вы, пожалуйста, кто-нибудь сказать причину этого?

Что я уже пробовал:

Я просмотрел сеть, но не смог получить никаких объяснений.

3 Ответов

Рейтинг:
1

KarstenK

Литье типа может привести к странным ошибкам, когда сделано неправильно, поэтому лучше избегать этого или обращаться с ним с наибольшей осторожностью.

Поэтому избегайте приведения типа к пустоте*, потому что программист и компилятор теряют драгоценную информацию об объектах. Любое приведение вверх приводит к различному обращению с функциями и имеет, таким образом, опасность аварии.

Обычно это признак плохого дизайна или кодирования жук Может быть, не в вашем примере, а в вашем реальном коде.


Рейтинг:
1

Rick York

Одна вещь, которую я нахожу полезной в этих ситуациях, - это использование определений типов. Вот несколько типов, которые я бы определил в этой ситуации :

typedef struct Foo * pFoo;
typedef std::vector<pFoo>  vecpfoo;
Тогда я бы приспособил ваши функции к этому :
void reportFoo( int index, pFoo pf )
{
   cin << "Foo item: " << index << endl;
   cin << "Member s: " << pf->s << endl;
   cin << "Member i: " << pf->i << endl;
}

void reportFooVector( vecpfoo & vpf )
{
   // this should be written with an iterator loop
   int count = (int)vpf.size();
   for( int i; i < count; ++i )
       reportFoo( i+1, vpf[i] );
}
и я бы переписал основную функцию следующим образом:
int main()
{
   struct Foo foo = { "foo", 5 };
   struct Foo goo = { "goo", 10 };
   vecpfoo vf;
   vf.push_back( &foo );
   vf.push_back( &goo );

   reportFooVector( vf );
}


Рейтинг:
0

CPallini

Причина проста: reinterpret_cast работает только с указателями (это короткий ответ, для подробного, не стесняйтесь читать документацию: преобразование reinterpret_cast - cppreference.com[^]).


CPallini

Именно так.