我很高兴使用C ++,直到编译时间到来。
我在一些命名空间里面有几个类(我们称之为N);这些类中的两个对应于一个基类,而另一个对应于它。每个类都有自己的.hpp和.cpp文件对;我认为它看起来像:
namespace N{
class Base{
};
class Derived: public Base{
};
}
然而,g ++(也许是链接器)一直告诉我:
Derived.hpp:n: error: expected class-name before ‘{’ token
它不能将Base识别为一个类,即使我正确地#include了与其定义相对应的hpp文件到Derived的.hpp!
“这是#includes的东西”,我想,因为这些类的.hpps在其他文件中是#included,所以我将它添加到Derived.hpp中的Derived声明中:
#include "Base.hpp"
namespace N{
class Base;
class Derived: public Base{
};
}
现在g ++抱怨:
Derived.hpp:n: error: invalid use of incomplete type ‘struct N::Base’
所以,我迷路了。请帮助我,我会慷慨解囊。 :)
(顺便说一句,我在Python方面很有经验,而不是C ++,所以这个问题对我来说真的很奇怪。而且,我改变了类的名字和东西:)。
编辑:我的文件的更准确的表示形式是:
File Pieza.hpp
-----------------------
#include "Celda.hpp"
namespace Reglas
{
class Pieza
{
public:
Pieza() {}
virtual ~Pieza() {}
private:
Celda *c;
};
}
File Jugador.hpp
-----------------------
#include "Jugada.hpp"
#include "Excepciones.hpp"
#include "Pieza.hpp"
namespace Reglas
{
//compiler asked for these :S
class Celda;
class Tablero;
class Jugador : public Pieza
{
public:
Jugador() {}
virtual ~Jugador() {}
};
}
答案 0 :(得分:3)
您的文件应如下所示:
File Base.hpp
-----------------------
namespace N
{
class Base
{
public:
Base() {}
virtual ~Base() {} // Make sure you have a virtual destructor
};
}
File Derived.hpp
-----------------------
#include "Base.hpp"
namespace N
{
class Derived : public Base
{
public:
Derived() {}
~Derived() {}
};
}
答案 1 :(得分:3)
Derived.hpp:n: error: invalid use of incomplete type ‘struct N::Base’
这让我觉得您在#include "Base.hpp
源文件中没有Derived.cpp
。
编辑:在Derived.cpp
中,尝试将#include
的顺序更改为:
#include "base.hpp"
#include "derived.hpp"
// .. rest of your code ..
像这样:
// Derived.hpp
#pragma once
namespace foo
{
class Base;
class Derived : public Base
{
public:
Derived();
~Derived();
};
}
// Derived.cpp
#include "base.hpp"
#include "derived.hpp"
namespace foo
{
Derived::Derived()
{
}
Derived::~Derived()
{
}
}
所以,你想要编辑Jugador.hpp
看起来像这样:
// Jugador.hpp
#include "Pieza.hpp" // move this above Jugada.hpp
#include "Jugada.hpp"
#include "Excepciones.hpp"
namespace Reglas
{
//compiler asked for these :S
class Celda;
class Tablero;
class Jugador : public Pieza
{
public:
Jugador() {}
virtual ~Jugador() {}
};
}