我制作了一个较小的可重现版本的代码,它给我这些错误:'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)。
方案一
删除 header 中的 {}
。这将告诉编译器您声明了这样一个类存在,但稍后将对其进行定义。你的代码会编译。不幸的是,如果您将 header 包含在其他 cpp 中,那么它们只能非常有限地使用 MySecondClass
。
解决方案2
在 header 中定义类及其所有成员(但不提供成员函数的实现:签名就足够了)。这将允许该类在任何 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 中的include 顺序应首先包含标准库头文件,然后才包含您自己的头文件。这对您的简单示例没有影响,但最好立即使用这些良好做法。
关于C++ - 'class' 类型重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57391143/