C++ - "类"类型重新定义

C++ - 'class' type redefinition

本文关键字:定义 新定义 类型 C++      更新时间:2023-10-16

我制作了一个较小的可重现版本的代码,给了我这些错误:'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 中的包含序列应首先包含标准库标头,然后仅包含您自己的标头。在您的简单示例中,它没有区别,但最好立即使用良好做法。