C2371错误:重定义;不同的基本类型
C2371 Error: redefinition; different basic types
所以,我正在为我的大学做一个项目,我得到了标题中所述的错误。这是我的代码。
//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;
作为个人规则,我倾向于将所有自己的代码放在名称空间中,因为它减少了此类冲突的可能性,并且我建议通常将所有自己的类放在它们自己的名称空间中。
相关文章:
- 类没有命名C++代码中的类型错误
- 不完整类型错误(E0409、E0070、E0515)
- 使用具有结构不完整类型错误的模板
- 不命名构造函数和析构函数上的类型错误
- 返回派生类型时出现协变类型错误
- 为什么此构造函数没有给出不完整的类型错误?
- 定义模板化结构的特征时出现不完整的类型错误
- 使用重载构造函数时出现不完整的类型错误
- 为什么我得到表达式必须有类类型错误?
- 输出 [left]=input[i] 行中的 c++ 代码中存在无效的类型错误
- 枚举成员不是类型错误
- 如何修复"ctypes"。参数错误:参数 2:<键入"异常.类型错误">:RaspberryPi 中的错误类型"错误
- 外部 "C" Visual Studio 2015 中的显式类型错误,DLL 测试代码
- 非默认析构函数会导致不完整的类型错误
- 为什么按引用传入会导致绑定引用类型错误
- Objective-C C++ 包装器 类型错误的不完整定义
- 输入类型错误
- 当构造函数的参数类型错误时引发异常
- 命名空间中的'bad_cast' 'std' 未命名类型错误
- C UNWORKOWN类型错误