Как определить функцию оверида шаблона не встроенным способом - PullRequest
2 голосов
/ 25 августа 2011

Привет, поэтому у меня есть класс шаблона с именем Body, который принимает одного потомка sf :: Drawable в качестве аргумента шаблона, и я пытаюсь переопределить функцию Render () только для случая, когда аргумент шаблона является sf :: Форма.

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

Если это поможет, вот код, который выдает ошибку:

// in the header file
template<typename drawable= void>
class Body : public sf::Drawable
{
    void Render(){Do_Something();
}

template <> 
class Body<Shape> : public sf::Drawable
{
    void Render();
}

// in the cpp file
void Body<Shape>::Render()
{
    Do_Something_Else();
}

1 Ответ

1 голос
/ 25 августа 2011

Вы имеете в виду, как это?

template <typename T> 
struct Foo {
    int frob() const;
};

// Note: Member function specializations do not require 
//       full class specializations.

template <typename T> 
int Foo<T>::frob() const { return 42; }

template <> 
int Foo<float>::frob() const { return 0xbeef; }


#include <iostream>
int main () {
    std::cout << Foo<int>().frob() << '\n';
    std::cout << Foo<float>().frob() << '\n';
}

Обратите внимание, что специализации должны быть видны там, где вы их используете, поэтому в большинстве случаев их тоже нужно помещать в заголовок.

...