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

标签 c++ class namespaces

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

相关文章:

c++ - 函数不返回输入数组的最高值和最低值

Android NDK 套接字连接问题

c++ - 为什么没有任何标准的 C 和/或 C++ 语言网关接口(interface)作为 Python 的 WSGI?

python - 为什么我不能修改作为函数内部参数传递的列表?

c++ - 构造用于追加的字符串

css - 如何在div中选择一个跨度?

c++ - 订购结构成员

c++ - 一次性使用类

c# - 为什么我应该在每个 aspx 页面中包含 namespace ?

jquery 插件多次触发