#ifndef __TEST__
#define __TEST__
namespace std
{
template<typename T>
class list;
}
template<typename T>
void Pop(std::list<T> * l)
{
while(!l->empty())
l->pop();
}
#endif
и использовал эту функцию в моем main. Я получаю ошибки. Конечно, я знаю, что есть еще параметры шаблона для std::list
(мне кажется, распределителя). Но это не относится к делу. Должен ли я знать полное объявление шаблона класса шаблона, чтобы пересылать его объявление?
РЕДАКТИРОВАТЬ: Я раньше не использовал указатель - это была ссылка. Попробую с указателем.
std::allocator<T>
__TEST__
зарезервированный идентификатор, не используйте его .Ответы:
Проблема не в том, что вы не можете напрямую объявить шаблонный класс. Да, вам нужно знать все параметры шаблона и их значения по умолчанию, чтобы иметь возможность правильно пересылать-объявить его:
Но делать даже такое предварительное объявление
namespace std
явно запрещено стандартом: единственное, что вам разрешено,std
- это специализация шаблона , обычноstd::less
для определяемого пользователем типа. При необходимости кто-то другой может процитировать соответствующий текст.Просто
#include <list>
и не беспокойся об этом.Кстати, любое имя, содержащее двойное подчеркивание, зарезервировано для использования реализацией, поэтому вы должны использовать что-то вроде
TEST_H
вместо__TEST__
. Он не будет генерировать предупреждение или ошибку, но если ваша программа имеет конфликт с идентификатором, определяемым реализацией, то она не гарантирует правильную компиляцию или выполнение: она плохо сформирована . Также запрещены имена, начинающиеся с символа подчеркивания, за которым следует заглавная буква. В общем, не начинайте с подчеркивания, если не знаете, с какой магией имеете дело.источник
namespace std
декларацию кстати?#pragma once
вместо # ifdef. В наши дни он поддерживается большинством компиляторов.#pragma
это вот почему. Хотя это вариант.Я решил эту проблему.
Я реализовал уровень OSI (окно слайдера, уровень 2) для моделирования сети на C ++ (Eclipse Juno). У меня были фреймы (шаблон
<class T>
) и его состояния (шаблон состояния, предварительное объявление).Решение заключается в следующем:
В
*.cpp
файл вы должны включить файл заголовка, который вы пересылаете, т.е.Его cpp:
И ... еще один класс.
источник
using namespace
в файл заголовка - очень плохая практика, потому что это не позволяет любому, кто использует этот файл заголовка, использовать локальные имена, которые в противном случае были бы действительными. Это в основном поражает всю точку пространств имен.В форвардном объявлении должен быть указан полный список аргументов шаблона.
источник
есть ограниченная альтернатива, которую вы можете использовать
заголовок:
каст:
не тестировался в реальных программах, поэтому ожидайте, что он не идеален.
источник