"class template has already been declared as a non-class template"

11,947

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.

Share:
11,947
Griffin
Author by

Griffin

Updated on June 15, 2022

Comments

  • Griffin
    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