Синтаксические ошибки шаблона Visual C ++ - PullRequest
1 голос
/ 04 декабря 2011

У меня есть заголовочный файл ...

#include <SFML\Graphics.hpp>
#include <SFML\Graphics\Drawable.hpp>
#include <SFML\System.hpp>
#include <iostream>

#ifndef _SPRITE_H_
#define _SPRITE_H_

namespace Engine 
{
    template <class T>
    class Sprite
    {
        sf::Vector2<T> * vector;
        sf::Sprite * sprite;

    public:
        Sprite(sf::Vector2<T> vect, sf::Sprite spr) 
        { 
            this->sprite = spr;
            this->vector = vect;            
        }
        ~Sprite();
        bool Draw(T x, T y, T rotate = 0);
        sf::Image GetImage()
        {
            return this->sprite->GetImage();
        }
    };
};

#endif _SPRITE_H_

И исходный файл ...

#include <SFML/Graphics.hpp>
#include <SFML/Config.hpp>

#include "sprite.h"

template <typename T>
Sprite(sf::Vector2<T> vector, sf::Sprite sprite) 
{
    this->sprite = sprite;
    this->vector = vector;
}

template <typename T>
bool Draw(T x, T y, T rotate) 
{
    return false;
}

В VS 2010, когда я компилирую VC ++, я получаю следующие ошибки:

Error   2   error C2143: syntax error : missing ';' before '<'  c:\users\owner\documents\visual studio 2010\projects\engine2\engine2\sprite.cpp 7   1   Engine2
Error   3   error C4430: missing type specifier - int assumed. Note: C++ does not support default-int   c:\users\owner\documents\visual studio 2010\projects\engine2\engine2\sprite.cpp 7   1   Engine2
Error   4   error C2988: unrecognizable template declaration/definition c:\users\owner\documents\visual studio 2010\projects\engine2\engine2\sprite.cpp 7   1   Engine2
Error   5   error C2059: syntax error : '<' c:\users\owner\documents\visual studio 2010\projects\engine2\engine2\sprite.cpp 7   1   Engine2
Error   6   error C2059: syntax error : ')' c:\users\owner\documents\visual studio 2010\projects\engine2\engine2\sprite.cpp 7   1   Engine2
Error   7   error C2143: syntax error : missing ';' before '{'  c:\users\owner\documents\visual studio 2010\projects\engine2\engine2\sprite.cpp 15  1   Engine2
Error   8   error C2447: '{' : missing function header (old-style formal list?) c:\users\owner\documents\visual studio 2010\projects\engine2\engine2\sprite.cpp 15  1   Engine2

Я абсолютный новичок в C ++ (пришедший из C #), и у меня были проблемы с компиляцией этого простого файла как средства, по крайней мере, для изучения синтаксиса, прежде чем я продолжу. Как вы можете видеть, все, что я пытаюсь сделать, это ссылаться на шаблон из файла заголовка на исходный файл, так что ссылка на шаблон влияет на все мои методы.

Что я делаю не так? Я пытался понять эти сообщения компилятора, но у меня возникли проблемы с их расшифровкой.

Обновление

последовал совет: позаботился почти обо всем, кроме этого:

Error   1   error C2995: 'Engine::Sprite<T>::Sprite(sf::Vector2<T>,sf::Sprite)' : function template has already been defined    c:\users\owner\documents\visual studio 2010\projects\engine2\engine2\sprite.cpp 12  1   Engine2

1 Ответ

2 голосов
/ 04 декабря 2011

Поскольку Sprite находится внутри Engine, оно должно быть

template <typename T>
Engine::Sprite<T>::Sprite(sf::Vector2<T> vector, sf::Sprite sprite)
{ ... }

И

template <typename T>
bool Engine::Sprite<T>::Draw(T x, T y, T rotate)
{
    return false;
}

Или, как подсказывает @jli, поместить его в пространство имен Engineтоже:

namespace Engine {
    template <typename T>
    Sprite<T>::Sprite(sf::Vector2<T> vector, sf::Sprite sprite)
    { ... }

    template <typename T>
    bool Sprite<T>::Draw(T x, T y, T rotate)
    {
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...