嘿,当我在后面的代码中留下namespace sf{
声明时,我得到了这个奇怪的错误:
1>c:\libraries and headers\sfml\sfml-1.6-sdk-windows-vc2008\sfml-1.6\include\sfml\graphics\body.h(70): error C2989: 'sf::Body' : class template has already been declared as a non-class template
1>c:\libraries and headers\sfml\sfml-1.6-sdk-windows-vc2008\sfml-1.6\include\sfml\graphics\body.h(11): error C3856: 'sf': class is not a class template
代码在过去3周内不是模板类时运行正常,使用相同的sf :: Body类名;我刚刚改变它以使其更灵活。我不能在命名空间内声明模板类或者什么?
以下是代码:
#include <SFML/Graphics.hpp>
#include <vector>
#include <math.h>
#include <cmath>
namespace sf{ //when i take this out and the closing bracket the code runs fine
template<typename drawable>
class Body : public sf::Drawable{
private:
sf::Vector2f MoveVal;
std::vector<drawable> Drawables;
public:
Body(const Vector2f& Position = Vector2f(0, 0), const Vector2f& Scale = Vector2f(1, 1), float Rotation = 0.f, const Color& Col = Color(255, 255, 255, 255)){
SetPosition(Position);
SetScale(Scale);
SetRotation(Rotation);
SetColor(Col);};
// Overide Drawable Functions To Detect any Movement
void SetX(float X){
MoveVal.x += X - GetPosition().x;
Drawable::SetX(X);};
void SetY(float Y){
MoveVal.y += Y - GetPosition().y;
Drawable::SetY(Y);};
// Regular Functions
void AddObject(drawable& Object){
Object.Move(GetX(),GetY());
Drawables.push_back(Object);};
void DestroyObject(unsigned short Index){
Drawables.erase(Drawables.begin()+Index);};
void Clear(){
Drawables.clear();};
drawable& GetObject(unsigned short index)
{return Drawables[index];};
unsigned int GetNumbObjects()
{return Drawables.size();};
void Draw(sf::RenderTarget& target){
for(unsigned short I=0; I<Drawables.size(); I++){
//Body offset
Drawables[I].SetPosition(
Drawables[I].GetPosition().x + MoveVal.x,
Drawables[I].GetPosition().y + MoveVal.y);
} // TODO: add tint based on overall Body Color
target.Draw(*this);
//Reset all the Change Values
MoveVal.x=0;
MoveVal.y=0;
};
void Render(sf::RenderTarget& target) const{
for(int I=0; I< Drawables.size(); I++)
Drawables[I].Draw(target);
};
};// Body Class
} //namespace sf
答案 0 :(得分:9)
根据您的信息,两个最有可能的候选人是Graphics.hpp
不匹配{
}
或您有class Body
的前瞻声明而未将其标记为模板。
答案 1 :(得分:5)
好的发现了问题:
在之前提供的头文件中: Shape.hpp 我使用以下语法将Body
声明为朋友:
friend class Body;
这显然使编译器假定Body不是模板(没有模板指示) 正确的语法是:
template <typename drawable>
friend class Body;
因为现在编译器将Body理解为模板类
答案 2 :(得分:4)
sf::Body
是一个似乎已经被采用的名称(对于一个类,而你正在声明一个模板)。您确定要将代码放在sf
命名空间中吗?使用自己的名称空间而不是他们使用的库的名称空间更为习惯。