"class template has already been declared as a non-class template"
Solution 1
The two most likely candidates based on your information are that Graphics.hpp
has mismatched {
}
or that you had a forward declaration of class Body
without marking it a template.
Solution 2
Ok found the problem:
In a previously included header file: Shape.hpp I declare Body
as a friend with the following syntax:
friend class Body;
Which apparently makes the compiler assume Body is not a template (no template indication is made) The correct syntax was:
template <typename drawable>
friend class Body;
Because now the compiler understands Body as a template class
Solution 3
sf::Body
is a name that seems to be already taken (for a class whereas you're declaring a template). Are you sure you want to put your code in the sf
namespace? It's more customary to use one's own namespaces rather than those of the libraries they use.
Griffin
Updated on June 15, 2022Comments
-
Griffin almost 2 years
Hey i'm getting this odd error when I leave the
namespace sf{
declaration in the later code: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
The code worked fine when it wasn't a template class for the past 3 weeks, With the same sf::Body class name; i just recently changed it to make it more flexible. Can i not declare a template class inside a namespace or what?
Here's the code:
#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