6
votes

C ++ / CLI: Pourquoi ne puis-je pas passer des chaînes par référence?

Pourquoi le C ++ / CLI de Microsoft ne permet pas de passer des chaînes par référence? J'ai reçu l'erreur suivante:

C3699: '&': Impossible d'utiliser cette indirection sur le type 'System :: String'


2 commentaires

J'ai ajouté la balise C ++ - CLI parce que cela ressemble à ce que vous utilisez ici.


Tout comme point de référence: C ++ / CLI est pas C ++; Malgré la similitude dans les noms, les balises C ++ et C ++ - CLI sont assez proches de l'exclusivité mutuellement exclusive; Les questions sur un (y compris celui-ci) ne ressentent souvent aucun sens en ce qui concerne l'autre.


3 Réponses :


2
votes

On dirait que vous utilisez géré C ++. Vous devez utiliser System :: string ^ à la place.


0 commentaires

12
votes

On dirait que vous utilisez géré c ++, qui est un bâtard C ++ utilisé avec la framework .NET.

Dans géré C ++, je pense que la syntaxe que vous recherchez est System :: string ^ . La raison en est que, puisque les types gérés sont recueillis par .NET Framework, vous n'êtes pas autorisé à créer des références «régulières» car le GC doit suivre toutes les références à une variable spécifique de savoir quand il est prudent de sa protéger. .


1 commentaires

Jetez un coup d'œil au didacticiel de Microsoft sur le marshaling de données pour une discussion approfondie sur la manière dont la mémoire est gérée entre Native C / C ++ et géré C ++. MSDN.MicRosoft.com/en-us/Library/ms384317 (Vs.71) .aspx



31
votes

Tout d'abord, il y a vraiment deux dialectes C ++ spécifiques à Microsoft pour .NET: les plus anciens "grésés C ++" (Visual Studio 2002 et 2003) et C ++ / CLI (Visual Studio 2005 et ultérieurement).

in c ++ / Cli, system :: string ^ est une référence .NET à une chaîne; Certains auteurs appellent cela un "pointeur de suivi" pour le comparer et le contraster avec un pointeur C ++ normal. Comme en C ++, vous pouvez transmettre des références .NET "par référence", mais au lieu d'utiliser & , vous utilisez % , comme dans: xxx


2 commentaires

Avons-nous explicitement besoin de supprimer le "résultat" de la variable passée de la couche C # ou le GC s'occupe-t-il de la supprimer?


Je pense que GC prendra soin de cela.