Maison >développement back-end >C++ >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 ?

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
WBOYoriginal
2023-08-22 10:30:441409parcourir

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;
};

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

error: template argument required for 'class FriendClass'
     friend class FriendClass;
                            ^

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;
};

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!

Déclaration:
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