Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
#1

Ошибка при реализации класса, использующего шаблоннный тип. - C++

19.10.2010, 18:19. Просмотров 360. Ответов 3
Метки нет (Все метки)

Пытаюсь реализовать шаблон Strategy

в STR.h пишу

C++
1
2
3
4
5
6
7
8
template<class StrategyType>
class Context
{
public:
    void Operation();
private:
    StrategyType TheStrategy;
};
в STR.cpp

C++
1
2
3
4
void Context::Operation()
{
    TheStrategy.Algoritm();
}
Компилятор выдаёт ошибки:
`template<class StrategyType> class Context' used without template parameters STR.cpp /Strategy/src line 13 C/C++ Problem
`TheStrategy' was not declared in this scope STR.cpp /Strategy/src line 15 C/C++ Problem

Если писать реализацию метода в хэдере, то всё прекрасно работает, но хотелось всю реализацию спихнуть в отдельный файл, а компилятору, видимо, не нравится, что поле не описано в этом файле (ибо замена спецификатора поля на public не даёт результатов). Подскажите, что можно сделать с такой бедой?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2010, 18:19     Ошибка при реализации класса, использующего шаблоннный тип.
Посмотрите здесь:

Ошибка при использовании итератора в реализации класса - C++
На скрине всё понятно чо каво. Собственно, что я упустил? Что не дочитал? Проясните, пожалуйста. Из-за медленного интернета не могу...

Ошибка компиляции при реализации класса-шаблона - C++
Не могу понять почему компилятор ругается. Помогите разобраться. #include &lt;iostream&gt; using namespace std; template...

Не использовать имя класса при его реализации - C++
Из-за того, что не смог грамотно сформулировать свой вопрос, не нашел ничего в гугле :( Поэтому объясню на примере: Допустим, есть...

Деструктор для абстрактного класса, использующего static vector - C++
Доброго времени суток. Возникла проблема с написание деструктора абстрактного класса, использующего static vector для хранения ссылок на...

Ошибка при реализации стека - C++
Здравствуйте, помогите пожалуйста разобраться в ошибке.Пишу класс, в нём есть динамический символьный массив, вызываю функцию void без...

Ошибка при реализации калькулятора - C++
Собственно, пишу первую программу (банальный калькулятор), принцип его работы такой: Пользователь выбирает нужное ему действие с числами,...

Ошибка при вызове метода класса в методе другого класса - C++
Господа программисты, возникла такая проблема. При вызове метода класса в методе другого класса выходит такая ошибка &quot; нестандартный...

Ошибка при реализации move конструктора для списка - C++
List(List&amp;&amp;L) { Head = Tail = nullptr; Node*temp = L.Head; Head = temp; L.Head = nullptr; while (L.Head) { ...

Code::Blocks, ошибки при сборке проекта, использующего OpenGL - C++
Всем привет! У меня вот такие ошибки: ||=== Build: Debug in test6 (compiler: GNU GCC Compiler) ===| obj\Debug\test6Main.o||In...

Статическое поле класса, имеющее тип того же класса - C++
Всем доброго времени суток. Как известно, поля класса могут быть ссылками, либо указателями на тот же класс, в котором объявляются, но не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
19.10.2010, 19:14     Ошибка при реализации класса, использующего шаблоннный тип. #2
Шаблон - это не класс, а заготовка, по которой компилятор напишет класс и его методы при инстанциации (это когда ты подставишь конкретные типы в параметре шаблона). Поэтому методы шаблонов в .cpp не выносятся, а пишутся в том же заголовке. Проще всего описать метод прямо при его объявлении внутри класса, но можно и так:
C++
1
2
3
4
5
template<class StrategyType>
void Context<StrategyType>::Operation()
{
    // ...
}
DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
19.10.2010, 19:30  [ТС]     Ошибка при реализации класса, использующего шаблоннный тип. #3
Спасибо, так получается, но только если реализация остаётся в хэдере. Если выносить в срр фаил, то всё равно выскакивает ошибка, но уже при вызове метода типа:
Context<AStrategy> AS;
AS.Operation();

Как оказалось при раскопках в интернете, сделать реализацию метода, если используется шаблон, в отдельном модуле практически не представляется возможным (можно сделать, как выяснилось, forward instance, но к сожалению я не смог раскопать что это такое, да и оно ограничивает количество возможных для использования типов, как я прочитал)
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
19.10.2010, 19:48     Ошибка при реализации класса, использующего шаблоннный тип. #4
Я об этом и говорил. Метод у шаблона - это не функция. Это образец, по которому будут создаваться методы создаваемых классов при инстанциации. Подставили один тип - из шаблона создаётся класс, создаются методы к нему. Подставили другой тип - создаётся ещё один класс, к нему создаются свои методы.
Yandex
Объявления
19.10.2010, 19:48     Ошибка при реализации класса, использующего шаблоннный тип.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru