Maison > développement back-end > C++ > le corps du texte

Erreur de syntaxe C++ : les amis ne peuvent pas être déclarés dans la définition du modèle de classe, comment y remédier ?

WBOY
Libérer: 2023-08-22 10:30:44
original
1379 Les gens l'ont consulté

C++ est un langage de programmation puissant doté d'une syntaxe et d'un mécanisme de modèles riches, permettant aux développeurs de créer diverses structures de données et algorithmes complexes. Mais lorsque nous utilisons C++, nous rencontrons souvent divers problèmes, dont des erreurs de déclaration d'ami.

Les amis sont un concept important dans le langage C++, qui permettent à une classe ou une fonction d'accéder aux membres privés d'une autre classe. Dans le développement réel, nous devons souvent utiliser le mécanisme ami pour accéder aux membres privés d'autres classes, comme implémenter la surcharge d'opérateurs, tester les fonctions privées de classe, etc. Cependant, l'utilisation d'amis dans les modèles de classe est plus difficile car le type d'instanciation dans le modèle de classe est inconnu.

La cause du problème est que les amis ne peuvent pas être déclarés dans les modèles de classe car les informations sur les membres de la classe ne sont pas connues avant l'instanciation. Une fois les amis déclarés, les membres spécifiques auxquels accéder doivent être déterminés. Cela conduit à une erreur de syntaxe dans laquelle il est illégal de déclarer des amis dans une définition de modèle de classe. Par exemple :

template<class T>
class MyClass {
    friend class FriendClass; // 错误!
    T member;
};
Copier après la connexion

À ce moment, le compilateur donnera le message d'erreur suivant :

error: template argument required for 'class FriendClass'
     friend class FriendClass;
                            ^
Copier après la connexion

Alors, comment corriger cette erreur ?

La solution est de déplacer la définition d'ami en dehors de la classe. Lorsque vous déclarez un ami en dehors d'une classe, vous devez utiliser le type d'instanciation spécifique pour déterminer les membres auxquels accéder. Par exemple :

template<class T>
class MyClass;
 
template<class T>
class FriendClass {
public:
    void Print(MyClass<T>* myClass) {
        std::cout << myClass->member << std::endl;
    }
};
 
template<class T>
class MyClass {
    friend class FriendClass<T>; // 正确
public:
    T member;
};
Copier après la connexion

Dans l'exemple ci-dessus, nous plaçons la déclaration de FriendClass devant MyClass et indiquons le type d'instanciation de T. De cette façon, FriendClass peut accéder aux membres de MyClass. Dans le même temps, nous devons également déclarer FriendClass comme ami dans MyClass, afin que MyClass soit accessible dans FriendClass.

Pour résumer, il est illégal de déclarer des amis dans un modèle de classe car le type dans le modèle de classe est inconnu. Si vous devez utiliser le mécanisme ami pour accéder aux membres privés d'autres classes, vous devez déplacer la définition d'ami en dehors de la classe et déterminer les membres auxquels accéder en instanciant le type. Cette méthode peut éviter les erreurs grammaticales et également atteindre l’objectif du mécanisme ami.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal