const TypedeffedIntPointer不等于const int *

时间:2010-05-06 14:24:37

标签: c++

我有以下C ++代码:

typedef int* IntPtr;
const int* cip = new int;
const IntPtr ctip4 = cip;

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

  

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

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

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

const MyType* 

const map<MyType*, somedata>::key_type

不相容,我遇到了问题。

此致 德克

2 个答案:

答案 0 :(得分:7)

当您编写const IntPtr ctip4时,您声明 const-pointer-to-int ,而const int * cip声明指向const-int < / em>的。这些不一样,因此转换是不可能的。

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

int * const cip = new int;

要在您的示例中解决此问题,您需要将地图的密钥类型更改为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
}

答案 1 :(得分:5)

const IntPtrint* const相同,而非const int*

也就是说,它是指向const的{​​{1}}指针,而不是指向int的指针。

解决方案是提供两个typedef:

const int

并在需要指向typedef int* IntPtr; typedef const int* ConstIntPtr; 的指针时使用ConstIntPtr