gpt4 book ai didi

C++ - 'class' 类型重定义

转载 作者:行者123 更新时间:2023-11-30 02:14:40 25 4
gpt4 key购买 nike

我制作了一个较小的可重现版本的代码,它给我这些错误:'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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com