【发布时间】:2018-09-25 12:13:36
【问题描述】:
我能够将vector<void*> 的引用类型转换为vector<Foo*> 的引用,而我无法对vector<void*> to vector<Foo*> 进行类型转换。我收到错误 C2440: 'reinterpret_cast' : cannot convert from 'std::vector<_ty>' to 'std::vector<_ty>' 为什么?
而且我能够将 void* 类型转换为 Foo* 而不会出现编译器错误。
void* g =&foo;
reportFooVector2(reinterpret_cast<Foo*>(g));
下面是我的全部代码。
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
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));
}
在上述程序中,我得到编译器 error C2440: 'reinterpret_cast' : cannot convert from 'std::vector<_ty>' to 'std::vector<_ty>' when调用行reportFooVector1( reinterpret_cast< vector < Foo * > >(vf));
请问有人能说出原因吗?
【问题讨论】:
-
void*是一个例外,它表示允许与任何其他指针类型进行转换。std::vector<void*>没有这样的例外 -
原因是在 C++ 中是不允许的。一个左值表达式只能被重新转换为一个类型的reference,除非左值表达式是一个指针、一个整数和枚举等...... vector 两者都不是,唯一可以 reinterpret_casted 的就是一个引用。
-
那些是指针,而不是引用。不是挑剔,因为 C++ 有实际的引用,而且这些是与指针不同的类型。最好使术语正确以避免混淆。
-
@SamVarshavchik 对我来说似乎是一个完美的答案,为什么要在评论中发布它?
-
为什么要存储一个 void* 指针向量?