错误 C2011:'SelectorBox':'class'类型重定义

error C2011: 'SelectorBox' : 'class' type redefinition

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

我对以下代码有问题:

 #ifndef HEADER_H_
    class SelectorBox{
    public:
        string selectorName;  
        map < string, string > attributeMap;
        void setSelectorName(string name);   
        void setAttribute(string key, string value); 
    };
    string trimTheString(string str); //trimming a string
    #endif
//include libraries 
#include "Header.h"
using namespace std;
int main()
{
    vector <SelectorBox> vectorSelectBox;
    SelectorBox *selectorBox;
//code
return 0;
}
#include "Header.h"
#include "main.cpp"
void SelectorBox::setSelectorName(string name)   //setter
{
    name = trimTheString(name);
    selectorName = name;
}
void SelectorBox::setAttribute(string key, string value)  //setter
{
    key = trimTheString(key);
    value = trimTheString(value);
    attributeMap[key] = value;
}

当我编译一个程序时,它显示许多错误(特别是错误 4430 和 2061(,但我认为主要错误是:错误 C2011:"选择器框":"类"类型重新定义。

您必须定义HEADER_H_ 。您错过了以下代码中的第二行。

#ifndef HEADER_H_
#define HEADER_H_
...
#endif

您两次包含相同的标头,第一次在main之后main 次,如果您不使用适当的包含保护,这会导致问题。

包含保护不完整,因此同一标头的多个包含将导致此错误。诀窍是检查是否定义了特定于标头的预处理器名称:如果没有,则定义它,否则跳过整个标头。

要使用的模式是这样的

#ifndef GUARD
#define GUARD
/// the actual header contents
#endif

但是简单地将其复制到每个标头中会导致另一个问题,因为它缺乏标头特异性。找到一个好名字的最简单方法是从文件名本身派生它。在您的情况下,我会以其中定义的类SelectorBox命名标头,因此SelectorBox.h将是一个好名称,并且包含守卫如下所示:

#ifndef SELECTORBOX_H
#define SELECTORBOX_H
class SelectorBox {
/// etc.
};
#endif
使用

具有相同包含保护的多个标头比根本不使用包含保护要糟糕得多。

我猜你有 3 个文件:

  • Header.h
  • main.cpp
  • FileX.cpp(到目前为止,您没有透露X先生的真实姓名(

main.cpp中,您包括Header.hFileX.cpp包括Header.hmain.cpp。让我展示一下这里发生的事情的简化版本:

main.cpp的内容被转换为

//include libraries 
class SelectorBox{
public:
    string selectorName;  
    map < string, string > attributeMap;
    void setSelectorName(string name);   
    void setAttribute(string key, string value); 
};
string trimTheString(string str); //trimming a string
using namespace std;
int main()
{
    vector <SelectorBox> vectorSelectBox;
    SelectorBox *selectorBox;
//code
return 0;
}

假设您包含stringmap,并且在类定义之前的某个地方有另一个using namespace std;,这可以编译而不会出错。

但是现在让我们看看FileX.cpp会发生什么.它的内容被转换为以下内容,我希望你现在能看到编译器看到的内容:类SelectorBox有多个定义

class SelectorBox{
public:
    string selectorName;  
    map < string, string > attributeMap;
    void setSelectorName(string name);   
    void setAttribute(string key, string value); 
};
string trimTheString(string str); //trimming a string
//include libraries 
class SelectorBox{
public:
    string selectorName;  
    map < string, string > attributeMap;
    void setSelectorName(string name);   
    void setAttribute(string key, string value); 
};
string trimTheString(string str); //trimming a string
using namespace std;
int main()
{
    vector <SelectorBox> vectorSelectBox;
    SelectorBox *selectorBox;
//code
return 0;
}
void SelectorBox::setSelectorName(string name)   //setter
{
    name = trimTheString(name);
    selectorName = name;
}
void SelectorBox::setAttribute(string key, string value)  //setter
{
    key = trimTheString(key);
    value = trimTheString(value);
    attributeMap[key] = value;
}

。编译器习惯称之为"重新定义"。