错误 C2011:'SelectorBox':'class'类型重定义
error C2011: 'SelectorBox' : 'class' type redefinition
我对以下代码有问题:
#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.h
,FileX.cpp
包括Header.h
和main.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;
}
假设您包含string
和map
,并且在类定义之前的某个地方有另一个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;
}
。编译器习惯称之为"重新定义"。
相关文章:
- 使用QJsEngine在Qt中注册自定义类型
- 在UE4中使用未定义类型'UTextBlock'
- 修改"std::set"中用户定义类型的值
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 如何使自定义类型在unordered_map中用作键
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- 为什么转换函数声明不需要至少一个定义类型说明符
- 标准::原子中的自定义类型
- 如何使用自定义类型声明Arduino数组?
- 如何在 Cython 中定义返回 cpp 定义类型的函数?
- 使用自定义访问者时具有自定义类型的提升变体失败(源自 boost::static_visitor)
- 您可以将binary_search应用于具有自定义类型的矢量吗?
- 在自定义类型图中重用 SWIG 映射
- 扩展自定义类型的spdlog
- vim使用户定义类型的COLOR与C++中的基本类型相同
- 重载自定义类型的 std::to_string 和 std::to_chars?
- 具有未声明/未定义类型的 typedef 结构
- 函数重载:内置类型与用户定义类型