«Шаблон classа уже объявлен как шаблон неclassов»

Привет, я получаю эту нечетную ошибку, когда я оставляю 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 

Код работал нормально, когда он не был classом шаблона в течение последних 3 недель, с тем же именем sf :: Body; я только недавно изменил его, чтобы сделать его более гибким. Могу ли я объявить class шаблона внутри пространства имен или что?

Вот код:

 #include  #include  #include  #include  namespace sf{ //when i take this out and the closing bracket the code runs fine template class Body : public sf::Drawable{ private: sf::Vector2f MoveVal; std::vector 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 , #include  #include  #include  #include  namespace sf{ //when i take this out and the closing bracket the code runs fine template class Body : public sf::Drawable{ private: sf::Vector2f MoveVal; std::vector 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 

Два наиболее вероятных кандидата, основанные на вашей информации, – это то, что Graphics.hpp имеет несоответствие { } или что у вас было объявление объявления class Body без указания его шаблона.

Ок нашел проблему:

В ранее включенном файле заголовка: Shape.hpp Я объявляю Body в качестве друга со следующим синтаксисом:

 friend class Body; 

Который, по-видимому, делает компилятор предполагаемым, что Body не является шаблоном (не указывается шаблон) Правильный синтаксис:

 template  friend class Body; 

Поскольку теперь компилятор понимает Body как class шаблона

sf::Body – это имя, которое, кажется, уже принято (для classа, тогда как вы объявляете шаблон). Вы действительно хотите поместить свой код в пространство имен sf ? Обычнее использовать собственные пространства имен, а не те библиотеки, которые они используют.