簡體   English   中英

C ++ - 'class'類型重定義

[英]C++ - 'class' type redefinition

我制作了一個較小的可重現版本的代碼,它給了我這些錯誤: '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中的include序列應首先包含標准庫頭,然后只包含您自己的頭。 它在您的簡單示例中沒有任何區別,但最好立即使用好的做法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM