msgstr "шаблон класса уже объявлен как неклассный шаблон" - PullRequest
2 голосов
/ 26 июля 2011

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

9 голосов
/ 26 июля 2011

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

5 голосов
/ 26 июля 2011

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

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

friend class Body;

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

template <typename drawable>    
friend class Body;

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

4 голосов
/ 26 июля 2011

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

...