C++ - "类"类型重新定义
C++ - 'class' type redefinition
我制作了一个较小的可重现版本的代码,给了我这些错误:'MyNamespace::MySecondClass': 'class' type redefinition
,'print': is not a member of 'MyNamespace::MySecondClass'
。有什么方法可以解决这个问题吗?
// MyClass.h
#pragma once
namespace MyNamespace {
class MySecondClass {};
}
// MyClass.cpp
#include "MyClass.h"
#include <iostream>
using namespace std;
class MyNamespace::MySecondClass
{
public:
void print(const char* msg)
{
cout << msg << endl;
}
};
问题是,在MyClass.h
中,您将类MySecondClass
定义为空类。 当您在 MyClass 中定义您的类时.cpp您会给出一个不同的定义,其中包含一些新成员。这违反了一个定义规则 (ODR(。
解决方案 1
删除标头中的{}
。这将告诉编译器您声明了此类存在,但稍后将对其进行定义。您的代码将编译。不幸的是,如果您在其他 cpp 中包含标题,这些标头只能非常非常有限地使用MySecondClass
。
解决方案 2
在标头中定义类及其所有成员(但不提供成员函数的实现:签名就足够了(。这将允许该类在任何 cpp 中使用 将包括它:
// MyClass.h
#pragma once
namespace MyNamespace {
class MySecondClass {
public:
void print(const char* msg);
};
}
然后,您将在相应命名空间中的 cpp 中定义类的成员:
// MyClass.cpp
#include <iostream>
#include "MyClass.h"
using namespace std;
namespace MyNamespace {
// member functions
void MySecondClass::print(const char* msg)
{
cout << msg << endl;
}
}
备注:cpp 中的包含序列应首先包含标准库标头,然后仅包含您自己的标头。在您的简单示例中,它没有区别,但最好立即使用良好做法。
相关文章:
- 在类定义之后定义一个私有方法
- Android Studio:如何在build.gradle中定义自定义宏(针对不同的构建变体),并让原生C / C++
- 如何在C++中为 if 和 else 语句定义新行为
- 如何从 C++ 中的现有模板函数定义新函数
- 如何在CPropertySheet中定义新颜色
- 谁定义新操作员
- boost :: fibonacci_heap:带有比较器重新定义圆形定义错误的嵌套定义
- C 通过Typedef定义新类型
- 在 ss.clear() 之后使用 ss.str( " ") 用于新定义的字符串流
- 是标头文件中使用“新”定义的成员指针泄漏
- 使用带有Eigen库的自定义新处理程序
- 定义新的优化类型
- C# 如何定义新的指针结构
- 为模型定义新角色后程序崩溃
- C++使用类来定义新类型
- 操作员新[]定义分解
- 为什么不调用复制构造函数将临时对象复制到新定义的对象
- Qt:在按钮点击上添加自定义新选项卡
- 定义新的中缀操作符
- 错误:不能在返回类型中定义新类型