Подтвердить что ты не робот

Как перенаправить объявление класса шаблона в пространстве имен std?

#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

и использовал эту функцию в моей основной. Я получаю ошибки. Конечно, я знаю, что для std::list (распределитель я думаю) больше параметров шаблона. Но это не относится к делу. Должен ли я знать полное объявление шаблона класса шаблона, чтобы его можно было объявить?

EDIT: раньше я не использовал указатель - это была ссылка. Я попробую его с указателем.

4b9b3361

Ответ 1

Проблема заключается не в том, что вы не можете перенаправить объявление класса шаблона. Да, вам нужно знать все параметры шаблона и их значения по умолчанию, чтобы иметь возможность переслать-объявить его правильно:

namespace std {
  template<class T, class Allocator = std::allocator<T>>
  class list;
}

Но для того, чтобы даже такое прямое объявление в namespace std было явно запрещено стандартом: единственное, что вам разрешено помещать в std, - это специализированная специализация шаблона, обычно std::less в пользовательском типе, Кто-то может при необходимости ссылаться на соответствующий текст.

Просто #include <list> и не беспокойтесь об этом.

О, кстати, любое имя, содержащее двойные подчеркивания, зарезервировано для использования реализацией, поэтому вы должны использовать что-то вроде TEST_H вместо __TEST__. Это не приведет к возникновению предупреждения или ошибки, но если ваша программа столкнулась с определенным по реализации идентификатором, то она не гарантируется скомпилировать или запустить правильно: она плохо сформирована. Также запрещены имена, начинающиеся с символа подчеркивания, за которым следует, в частности, прописная буква. В общем, не начинайте вещи с подчеркивания, если вы не знаете, с какой магией вы имеете дело.

Ответ 2

Я решил эту проблему.

Я реализовал слой OSI (окно слайдера, уровень 2) для моделирования сети на С++ (Eclipse Juno). У меня были фреймы (шаблон <class T>) и его состояния (шаблон состояния, форвардная декларация).

Решение выглядит следующим образом:

В файле *.cpp вы должны указать файл заголовка, который вы пересылаете, т.е.

ifndef STATE_H_
#define STATE_H_
#include <stdlib.h>
#include "Frame.h"

template <class T>
class LinkFrame;

using namespace std;

template <class T>
class State {

  protected:
    LinkFrame<int> *myFrame;

}

Его cpp:

#include "State.h"
#include "Frame.h"
#include  "LinkFrame.h"

template <class T>
bool State<T>::replace(Frame<T> *f){

И... другой класс.

Ответ 3

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

Ответ 4

существует ограниченная альтернатива, которую вы можете использовать

Заголовок:

class std_int_vector;

class A{
    std_int_vector* vector;
public:
    A();
    virtual ~A();
};

каст:

#include "header.h"
#include <vector>
class std_int_vector: public std::vectror<int> {}

A::A() : vector(new std_int_vector()) {}
[...]

не тестируется в реальных программах, поэтому ожидайте, что он будет не идеальным.