[英]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)。
刪除標題中的{}
。 這將告訴編譯器您聲明這樣的類存在但是稍后將定義它。 你的代碼會編譯。 不幸的是,如果你在其他cpp中包含標題,那么這些只會非常有限地使用MySecondClass
。
在頭部中定義具有其所有成員的類(但不提供成員函數的實現:簽名就足夠了)。 這將允許該類在包含它的任何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.