2010-05-06 6 views
3

J'ai le code C++ suivant:const TypedeffedIntPointer pas égal à const int *

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

compiler ce avec Visual Studio 2008 et obtenir l'erreur suivante:

error C2440: 'initializing' : cannot convert from 'const int *' to 'const IntPtr'

Il est clair que ma compréhension de typedefs n'est pas ce qui devrait être.

La raison pour laquelle je demande, je stocke un type de pointeur dans une carte STL. J'ai une fonction qui renvoie un pointeur const que je voudrais utiliser pour rechercher dans la carte (en utilisant la carte :: find (const key_type &). Depuis

const MyType* 

et

const map<MyType*, somedata>::key_type 

est incompatible , je vais avoir des problèmes.

Cordialement Dirk

Répondre

7

Lorsque vous écrivez const IntPtr ctip4, vous déclarez une const-pointeur à int, alors que const int * cip déclare un pointeur à const-int. Ce ne sont pas les mêmes, d'où la conversion est impossible.

Vous devez modifier la déclaration/initialisation de cip à

int * const cip = new int; 

Pour résoudre ce problème dans votre exemple, vous devez soit modifier le type de clé de la carte à const MyType * (ou non il est logique dépend de votre application, mais je pense que changer un objet MyType via un pointeur utilisé comme clé dans la carte est peu probable), ou revenir à const_casting le paramètre pour trouver:

#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 
} 
5

const IntPtr est le même que int* const, pas const int*.

Autrement dit, il s'agit d'un pointeur const vers un int, pas un pointeur vers un const int.

Une solution serait de fournir deux typedefs:

typedef int* IntPtr; 
typedef const int* ConstIntPtr; 

et utiliser ConstIntPtr lorsque vous avez besoin d'un pointeur vers un const int.