“class template has already been declared as a non

2019-07-22 08:08发布

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

3条回答
ゆ 、 Hurt°
2楼-- · 2019-07-22 08:31

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.

查看更多
3楼-- · 2019-07-22 08:41

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

查看更多
Ridiculous、
4楼-- · 2019-07-22 08:44

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.

查看更多
登录 后发表回答