C2371错误:重定义;不同的基本类型

C2371 Error: redefinition; different basic types

本文关键字:类型 错误 定义 C2371      更新时间:2023-10-16

所以,我正在为我的大学做一个项目,我得到了标题中所述的错误。这是我的代码。

//components.h
#ifndef COMPONENTS_H
#define COMPONENTS_H
#include <stdlib.h>
#include <string>
#include <iostream>
#include <Windows.h>
#define GRAY 8
#define BLUE 9
#define GREEN 10
#define CYAN 11
#define RED 12
#define PURPLE 13
#define YELLOW 14
#define WHITE 15
using namespace std;
template <class TYPE> class NODE
{
public:
    NODE()
    {
        next = NULL;
        prev = NULL;
    }
    TYPE data;
    NODE<TYPE> *next, *prev; //next and previous nodes
};
template <class TYPE> class LIST {
private:
    NODE<TYPE> *head, *tail;
public:
    int count;
    LIST() 
    {
        head = NULL; 
        tail = NULL;
    }
    ~LIST()
    {
        EmptyList();
    }
    NODE<TYPE>* GetElement(int n)//find nth element
    {
        if (n > count)
            return NULL;
        else
        {
            NODE<TYPE> *temp = NULL;
            if (n < (count / 2))
            {
                temp = head;
                for (int i = 0; i < (n - 1); i++) {
                    temp = temp->next;
                }
            }
            else
            {
                temp = tail;
                for (int i = 0; i < (count - n - 1); i++) {
                    temp = temp->prev
                }
            }
            return temp;
        }
    }
    void PushBack(TYPE data)
    {
        if (head == NULL)
        {
            head = new NODE<TYPE>();
            head->data = data;
            tail = head;
        }
        else
        {
            NODE<TYPE>* temp = new NODE<TYPE>();
            temp->data = data;
            temp->prev = tail;
            tail->next = temp;
            tail = tail->next;
        }
        count++;
    }
    void PopBack()
    {
        if (tail->prev != NULL)
        {
            tail = tail->prev;
            delete tail->next;
            tail->next = NULL;
        }
        else
        {
            delete tail;
            head = NULL;
            tail = NULL;
        }
        count--;
    }
    void EmptyList()
    {
        while (head != NULL)
            PopBack();
    }
};
class PARTICLE {
protected:
    double mass;
    float spin;
    double  electric_charge;
    string statistics;
    string name;
public:
    double getElectricCharge()
    {
        return electric_charge;
    }
    void printMass() { cout <<name<<" mass: "<< mass <<"u"<<endl; }
    void printSpin() { cout <<name<<" spin: "<< spin << endl; }
    void printElectricCharge() { cout <<name<<" electric charge: "<< electric_charge <<"e"<<endl; }
    void printStatistics() { cout <<name<<" statistics: " << statistics << endl;}
};
class ELECTRON : public PARTICLE {
public:
    ELECTRON()
    {
        name = "Electron";
        mass =   0.000548579909070;
        spin = 0.5f;
        electric_charge = -1;
        statistics = "Fermi-Dirac";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), CYAN);
        cout << "A(n) " << name << " has been constructedn";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
    ~ELECTRON()
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), CYAN);
        cout << "A(n) " << name << " will be destroyedn";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
};
class GLUON : public PARTICLE {
public:
    GLUON()
    {
        name = "Gluon";
        electric_charge = 0;
        spin = 1;
        statistics = "Bose-Einstein";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), GRAY);
        cout << "A(n) " << name << " has been constructedn";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
    ~GLUON()
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), GRAY);
        cout << "A(n) " << name << " will be destroyedn";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
};
class UP_QUARK : public PARTICLE{
public:
    UP_QUARK()
    {
        name = "Up Quark";
        electric_charge = 2.0/3.0;
        mass = 2.01;
        spin = 0.5f;
        statistics = "Fermi-Dirac";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), GREEN);
        cout << "A(n) " << name << " has been constructedn";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
    ~UP_QUARK()
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), GREEN);
        cout << "A(n) " << name << " will be destroyedn";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
    void printQuarkMass()
    {
        cout << name << " mass: " << mass <<" MeV/(c^2)"<<endl;
    }
};
class DOWN_QUARK : public PARTICLE {
public:
    DOWN_QUARK()
    {
        name = "Down Quark";
        electric_charge = -(1.0 / 3.0);
        mass = 4.7;
        spin = 0.5f;
        statistics = "Fermi-Dirac";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), PURPLE);
        cout << "A(n) " << name << " has been constructedn";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
    ~DOWN_QUARK()
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), PURPLE);
        cout << "A(n) " << name << " will be destroyedn";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
    void printQuarkMass()
    {
        cout << name << " mass: " << mass << " MeV/(c^2)" << endl;
    }
};
class PROTON : public PARTICLE{
private:
    LIST<DOWN_QUARK*> dqList;//1
    LIST<UP_QUARK*> uqList;//2
    LIST<GLUON*> gList;//3
public:
    PROTON()
    {
        dqList.PushBack(new DOWN_QUARK);
        uqList.PushBack(new UP_QUARK);
        uqList.PushBack(new UP_QUARK);
        gList.PushBack(new GLUON);
        gList.PushBack(new GLUON);
        gList.PushBack(new GLUON);
        name = "Proton";
        mass = 1.007;
        electric_charge = 1;
        spin = 0.5f;
        statistics = "Fermi-Dirac";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
        cout << "A(n) " << name << " has been constructedn";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
    ~PROTON()
    {
        dqList.EmptyList();
        uqList.EmptyList();
        gList.EmptyList();
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), YELLOW);
        cout << "A(n) " << name << " will be destroyedn";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
};
class NEUTRON : public PARTICLE{
public:
    LIST<DOWN_QUARK*> dqList;//2
    LIST<UP_QUARK*> uqList;//1
    LIST<GLUON*> gList;//3
    NEUTRON()
    {
        dqList.PushBack(new DOWN_QUARK);
        dqList.PushBack(new DOWN_QUARK);
        uqList.PushBack(new UP_QUARK);
        gList.PushBack(new GLUON);
        gList.PushBack(new GLUON);
        gList.PushBack(new GLUON);
        name = "Neutron";
        mass = 1.0085;
        spin = 0.5f;
        electric_charge = 0;
        statistics = "Fermi-Dirac";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BLUE);
        cout << "A(n) " << name << " has been constructedn";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
    ~NEUTRON()
    {
        dqList.EmptyList();
        uqList.EmptyList();
        gList.EmptyList();
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BLUE);
        cout << "A(n) " << name << " will be destroyedn";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
};
class NUCLEUS {
public:
    NUCLEUS();
    ~NUCLEUS();
    LIST<PROTON*> pList;
    LIST<NEUTRON*> nList;
};
class ATOM { //<================ ERROR APPEARS HERE
public:
    ATOM();
    ~ATOM()
    {
        nList.EmptyList();
        eList.EmptyList();
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), RED);
        cout << "An Atom has been destroyedn";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
    int getMassNumber();
    void printMassNumber();
    int getAtomicNumber();
    void printAtomicNumber();
    double getElectricCharge();
    void printElectricCharge();
    LIST<NUCLEUS*> nList;
    LIST<ELECTRON*> eList;
private:
    int mass_number;
    int atomic_number;
    double electric_charge;
};
#endif

你能帮我找出哪里出错了吗?错误似乎出现在第304行。我在代码中附加了一个注释,以使搜索更轻松:)

在Windows api中已经有一个ATOM类型,因此您正在获得Windows ATOM类型和您自己的ATOM类之间的冲突。

有两种可能的解决方案。首先,可以重命名类。这将避免与Windows API的冲突,并允许您的代码编译,但这可能不太理想。

另一种解决方案是将类包装在名称空间中。这将允许您保留当前名称,同时避免与Windows发生冲突。例子:

namespace MyNamespace
{
class ATOM { //<================ SHOULD COMPILE
public:
    ATOM();
    ~ATOM()
    {
        nList.EmptyList();
        eList.EmptyList();
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), RED);
        cout << "An Atom has been destroyedn";
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), WHITE);
    }
    int getMassNumber();
    void printMassNumber();
    int getAtomicNumber();
    void printAtomicNumber();
    double getElectricCharge();
    void printElectricCharge();
    LIST<NUCLEUS*> nList;
    LIST<ELECTRON*> eList;
private:
    int mass_number;
    int atomic_number;
    double electric_charge;
};
}
在您的代码中,您将像这样创建ATOM变量:
MyNamespace::ATOM myAtom;

作为个人规则,我倾向于将所有自己的代码放在名称空间中,因为它减少了此类冲突的可能性,并且我建议通常将所有自己的类放在它们自己的名称空间中。