Полиморфное явное создание шаблона - PullRequest
2 голосов
/ 17 ноября 2010

Иметь эту базовую иерархию:

// header

class Base
{
    virtual void method() { }
    virtual ~method() { }
};

class Subclass : Base
{
    virtual void method() { }
    virtual ~method() { }
};

Я хочу создать подкласс Base с двумя явными вариантами (без необходимости предоставлять две реализации подкласса, если это возможно), поэтому было предложено использовать явную реализацию шаблона:

// header

class Base
{
    virtual void method() { }
    virtual ~method() { }
};

class Base1 : public Base { };
class Base2 : public Base { };

template <typename T>    
class Subclass : public T
{
    virtual void method();
    virtual ~method() { }
};

// cpp

template <typename T>
void Subclass<T>::method()
{
}

template class Subclass<Base1>;
template class Subclass<Base2>;

Я получаю эту ошибку:

нет аргументов для 'метода' которые зависят от параметра шаблона, поэтому объявление метода должно быть доступны

Это правильный подход? Мне бы явно пришлось шаблон Base, чтобы заставить его скомпилировать, но с чем?

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

Вы должны поместить определение класса и функций вашего шаблона в заголовочный файл (должно быть видно, кто их использует).

Только полная специализация может быть объявлена ​​(и определена там, где ваш код имеетнет видимости).

Кроме того, если вы хотите определить функцию шаблона класса вне класса (как вы это сделали), вы должны объявить ее как шаблон:

template< typename T > 
void Class<T>::method( )
{
}

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

Вызовите method следующим образом:

T::method();
0 голосов
/ 01 декабря 2010

Краткое описание проблемы и решение:

Для использования метода из шаблонного базового класса требуется либо использование параметра шаблона:

T::method();

или просто используя «this», чтобы его можно было найти без явного знания параметра шаблона:

this->method();

Благодаря тем, кто указал мне на поиск этого решения, я не знал об этом. Также хочу отметить, что нет проблем с размещением шаблонов в файле cpp.

...