const TypedeffedIntPointer不等于const int*

dir*_*irk 3 c++

我有以下C++代码:

typedef int* IntPtr;
const int* cip = new int;
const IntPtr ctip4 = cip;
Run Code Online (Sandbox Code Playgroud)

我用Visual Studio 2008编译它并得到以下错误:

错误C2440:'初始化':无法从'const int*'转换为'const IntPtr'

显然,我对typedef的理解不是应该的.

我问的原因是,我将指针类型存储在STL映射中.我有一个函数返回一个const指针,我想用它在地图中搜索(使用map :: find(const key_type&).

const MyType* 
Run Code Online (Sandbox Code Playgroud)

const map<MyType*, somedata>::key_type
Run Code Online (Sandbox Code Playgroud)

是不相容的,我有问题.

关心德克

Luc*_*lle 7

当你编写时const IntPtr ctip4,你声明一个const-pointer-to-int,而const int * cip声明一个指向const-int指针.这些不一样,因此转换是不可能的.

您需要将cip的声明/初始化更改为

int * const cip = new int;
Run Code Online (Sandbox Code Playgroud)

要在您的示例中解决此问题,您需要更改映射的键类型const MyType *(是否有意义取决于您的应用程序,但我认为通过在地图中用作键的指针更改MyType对象是不太可能),或者回到const_casting参数来查找:

#include <map>

int main()
{
    const int * cpi = some_func();

    std::map<const int *, int> const_int_ptr_map;
    const_int_ptr_map.find(cpi); //ok

    std::map<int *, int> int_ptr_map;
    int_ptr_map.find(const_cast<int *>(cpi)); //ok
}
Run Code Online (Sandbox Code Playgroud)


Jam*_*lis 5

const IntPtrint* const,不是const int*.

也就是说,它是const指向a的指针int,而不是指向a的指针const int.

一个解决方案是提供两个typedef:

typedef int* IntPtr;
typedef const int* ConstIntPtr;
Run Code Online (Sandbox Code Playgroud)

ConstIntPtr在需要指针时使用const int.