Journal C ++ - la différence entre la fonction de modèle de décalage gauche sous Windows et Linux

Lors de l'apprentissage du C ++, nous utiliserons parfois le logiciel VS fourni par Microsoft. Nous rencontrerons des problèmes lors de l'apprentissage de la classe de modèle pour surcharger l'opérateur de décalage gauche. Écrivez un programme simple à titre d'exemple:

#include <iostream>
using namespace std;

template<class T>
class Complex
{
private:
    T a;
public:
    Complex(T a);
    friend ostream & operator<< <T>(ostream & os, const Complex<T> & obj); //VS中特殊的标志<T>
};

template<class T>
Complex<T>::Complex(T a)
{
    this->a = a;
}

template<class T>
ostream & operator<<(ostream & os, const Complex<T> & obj)
{
    os << "a = " << obj.a;
    return os;
}

int main(int argc, char const *argv[])
{
    Complex<int> c1(4);

    cout << c1 << endl; 

    system("pause");
    return 0;
}

Ce programme est juste un programme écrit en VS2010. Pour plus de commodité, j'écris ces programmes dans un seul fichier. Si vous voulez diviser la déclaration de la classe, la réalisation de la classe et la réalisation de la fonction principale en trois fichiers, vous devez La fonction principale contient le fichier de la réalisation de la classe, c'est-à-dire:
la déclaration de la classe modèle est dans ah, la réalisation de la classe est dans a.cpp, et la fonction principale est dans main.cpp, alors main.cpp doit contenir #include " "a.cpp" au lieu du fichier d'en-tête "ah", ce n'est qu'un petit détail, il est également applicable dans l'environnement Linux.

Dans le programme ci-dessus, la surcharge de l'opérateur << est ajoutée dans la partie déclaration pour que la classe modèle soit compilée et transmise. Ceci est lié à l'implémentation du compilateur VS et ne peut pas être écrit lors de l'écriture de l'implémentation de l'opérateur <<.

Ce même programme ne peut pas fonctionner sous Linux, car Linux utilise le compilateur g ++ et le principe de compilation du compilateur g ++ est différent de celui du compilateur VS. Sous Linux, le programme doit être écrit comme ceci:

#include <iostream>

using namespace std;

template<class T>
class Complex
{
private:
    T a;
public:
    Complex(T a);

    template<class Mytype> 
    friend ostream & operator<<(ostream & os, const Complex<Mytype> & obj);//在使用g++编译器中需要加上类的的前置声明
};

template<class T>
Complex<T>::Complex(T a)
{
    this->a = a;
}

template<class T>
ostream & operator<<(ostream & os, const Complex<T> & obj) 
{
    os << "a = " << obj.a;
    return os;
}
/*
template<class Mytype>
ostream & operator<<(ostream & os, const Complex<Mytype> & obj)
{
    obj.count++;
    os << "count = " << obj.count << endl;
    os << "a = " << obj.c_a;
    return os;
}
*/
int main(int argc, char const *argv[])
{
    Complex<int> c1(8);

    cout << c1 << endl; 
    return 0;
}

C'est le code écrit lors de l'utilisation du compilateur g ++ sous Linux. Parmi eux, l'autre que j'ai vérifié sur Internet est d'ajouter <> au milieu de l'opérateur << (...) ie: operator << <> (...) Cette méthode ne peut pas Compilez et passez dans le compilateur g ++.

L'opérateur de décalage gauche dans g ++ doit ajouter la déclaration de fonction de modèle de la classe lorsqu'elle est déclarée, et le type de la déclaration ne peut pas être le même que le type de déclaration de la classe, c'est-à-dire que l'opérateur de décalage gauche de la fonction amie de déclaration Mytype est utilisé dans le programme. Soit le type Mytype peut être utilisé pour l'implémentation, soit l'indicateur de type T peut être utilisé pour implémenter la surcharge de l'opérateur de décalage gauche. La sélection ici est la même que l'indicateur de déclaration de classe.

Je suppose que tu aimes

Origine blog.csdn.net/qq_32198277/article/details/77623270
conseillé
Classement