“类模板已被声明为非类模板”

时间:2011-07-26 04:37:22

标签: c++ class templates namespaces compiler-errors

嘿,当我在后面的代码中留下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

3 个答案:

答案 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命名空间中吗?使用自己的名称空间而不是他们使用的库的名称空间更为习惯。