2015-04-20 1 views
0

Pour simplifier ce problème, j'ai créé un nouveau projet MPF dans Visual Studio par Wizard. Je voudrais utiliser CAtlMap avec CString comme paramètre clé. J'inclus <atlcoll.h> tête et quand j'ai essayé de compiler le code suivant:CAtlMap utilise CString comme une clé

CAtlMap<CString, double> myMap; 
CString strMyKey = L"MyKey"; 

myMap.SetAt(strMyKey, 76.8); 

J'ai reçu cette erreur:

'<function-style-cast>' : cannot convert from 'const CString' to 'ULONG_PTR' 

Quand je les types simples (par exemple int) au lieu de CString projet a été compilé sans les erreurs. Est-il possible d'utiliser CString comme dans l'exemple ci-dessus? Peut-être que j'ai raté certains fichiers d'inclusion, que dois-je utiliser?

Répondre

1

Veuillez utiliser CMap au lieu de CAtlMap car il est obsolète/obsolète (les classes de collection ATL et MFC ont été unifiées). Vous devez définir votre carte comme ceci:

CMap<CString, LPCTSTR, double, double> myMap; 

S'il vous plaît Pensez également à utiliser au lieu de operator[]SetAt() pour une meilleure lisibilité de votre code.

Si pour une raison quelconque (compatibilité avec certains vieux/projet héritage) vous devez utiliser CAtlMap vous devez faire ceci: CAtlMap<CString, double, CStringElementTraits<CString> > map;

+0

Je dois utiliser 'CAtlMap', parce que je travaille avec un ancien projet et c'est la condition principale. J'ai déplacé quelques classes d'une bibliothèque (dll) à une autre et cette classe s'est arrêtée pour se compiler. J'essaie de réparer les fichiers déplacés. – rgb

+0

Essayez 'CAtlMap > map;' –

+1

Il n'y a rien dans les en-têtes ou MSDN qui indique que CAtlMap est obsolète. En fait, il a été créé après CMAP (ATL est beaucoup plus récent que MFC) et CMap n'est pas disponible dans ATL sauf si vous incluez les en-têtes MFC. Les programmes ATL DEVRAIENT utiliser CAtlMap, les applications MFC peuvent choisir. Vous aurez besoin des traits de chaîne car MFC utilise une spécialisation de CString qui n'est pas compatible avec les collections d'ATL. –

0

Visual Studio 2012 CAtlMap classe convient à l'utilisation mentionnée et ne donne pas d'erreurs du compilateur . Vous pouvez créer une case à cocher d'application console pour le support ATL, et ce code compile et fonctionne bien.

#include "stdafx.h" 
#include <atlcoll.h> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    CAtlMap<CString, double> myMap; 
    CString strMyKey = L"MyKey"; 
    myMap.SetAt(strMyKey, 76.8); 
    return 0; 
} 

Comme vous l'avez mentionné que vous travaillez avec un projet existant, il peut donc arriver qu'il a une copie de la version plus ancienne d'ATL, comme ATL 3.0. En effet, une ATL plus ancienne pourrait avoir un tel problème et si tel est le problème, vous devrez peut-être passer le code à de nouvelles classes de collection ATL.