【发布时间】: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.h和MyClass.cpp让我认为您想要接口和实现之类的东西。因此,标头应提供具有完整声明的类定义namespace MyNS { class MyClass { void print(); }; },而MyClass.cpp提供实现:void MyNS::MyClass::print() { std::cout << "anything"; }或namespace MyNS { void MyClass::print() { std::cout << "anything"; } }。 -
如果您打算隐藏
MyNS::MyClass的声明详细信息(我可以想象的替代方式),请查看 PImpl idiom。
标签: c++ class namespaces