【问题标题】:C++ - 'class' type redefinitionC++ - “类”类型重新定义
【发布时间】:2019-12-14 21:33:57
【问题描述】:

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

【问题讨论】:

  • class MySecondClass {}; 应该是class MySecondClass;
  • 除了 Alan:namespace MyNS { class MyClass; } 是一个不完整的类型,也就是前向声明。 (这将解决您的问题。)但是使用大括号:namespace MyNS { class MyClass { }; } 它成为一个完整的类型。现在,class MyNS::MyClass { void print(); }; 重新定义了以前被禁止的完整(类)类型。
  • 似乎存在一个普遍的误解。 MyClass.hMyClass.cpp 让我认为您想要接口和实现之类的东西。因此,标头应提供具有完整声明的类定义namespace MyNS { class MyClass { void print(); }; },而MyClass.cpp 提供实现:void MyNS::MyClass::print() { std::cout &lt;&lt; "anything"; }namespace MyNS { void MyClass::print() { std::cout &lt;&lt; "anything"; } }
  • 如果您打算隐藏 MyNS::MyClass 的声明详细信息(我可以想象的替代方式),请查看 PImpl idiom

标签: c++ class namespaces


【解决方案1】:

问题在于,在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 中的 include 序列应首先包含标准库头文件,然后只包含您自己的头文件。在您的简单示例中没有区别,但最好立即使用良好做法。

【讨论】:

  • 一个问题。当我想创建一个派生类,在头文件中声明它并在cpp文件中定义它时,它给了我一个错误。 class or struct definition missing
  • @PhysicalExperience 如果您没有找到与命名空间和派生类相关的类似问题,您能否将带有派生类的代码作为单独的问题发布?
猜你喜欢
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多