Шаблоны классов std :: set key - PullRequest
       0

Шаблоны классов std :: set key

0 голосов
/ 23 декабря 2010

У меня есть класс для оценки алгебры множеств, но я хочу его шаблонировать.

На данный момент это выглядит примерно так

set.h:

template<typename T>
  class SetEvaluation
  {
  public:
    SetEvaluation<T>();

    std::set<T>
    evaluate(std::string in_expression);
   }

set.cpp

template<typename T>
   std::set<T>
   SetEvaluation<T>::evaluate(std::string expression)
   {
     std::set<T> result;
     etc etc...
   }

Но я получаю неопределенные ссылочные ошибки при компиляции.

Можно ли объявить возвращаемый тип как std :: set , а затем передать std :: string в качестве параметра шаблона класса.

В классе нет ошибок, но только когда я пытаюсь создать экземпляр SetEvaluation

Может кто-нибудь пролить свет на эту проблему?

спасибо

Ответы [ 3 ]

2 голосов
/ 23 декабря 2010

Шаблонные классы и функции немного особенные и должны быть определены в заголовочном файле. Затем этот заголовочный файл должен быть #included везде, где вы хотите использовать этот класс шаблона. Если вы попытаетесь определить функции шаблона в файле cpp для компоновщика и попытаетесь вызвать эту функцию из другого файла cpp, компоновщик не сможет разрешить ссылку, поскольку компилятор не знал, что использовать для параметра T когда он скомпилировал файл с определением шаблона в нем. Лучший способ обойти это: 1) определить функцию в заголовочном файле и 2) включить ее, где это необходимо. Дополнительную информацию об этой проблеме можно найти в C ++ faq .

Пустяки

Существует еще один способ обойти это с помощью компилятора Comeau C ++, поскольку он поддерживает ключевое слово «export», однако это ключевое слово устарело в C ++ 0X.

1 голос
/ 23 декабря 2010

точка с запятой; после

template<typename T>
  class SetEvaluation

в .ч

и определить конструктор хотя бы пустой или закомментируйте

public:
    SetEvaluation<T>() {}

хорошо, в этом случае use хочет использовать это из другого файла. В этом случае вы должны явный экземпляр этого шаблона с этим синтаксисом в файле .cc:

template std::set<std::string> SetEvaluation<std::string>::evaluate(std::string expression);

или вы должны поместить определение в заголовочный файл

0 голосов
/ 23 декабря 2010

Для общего решения определите методы шаблона как встроенные в заголовочном файле, либо в теле класса, либо после него: [Для данной системы компилятора вы можете сделать иначе.]

template<typename T>
  class SetEvaluation
  {
  public:
    SetEvaluation<T>() { etc. etc.}

    std::set<T>
    evaluate(const std::string& in_expression);
   };

template<typename T>
   inline std::set<T>
   SetEvaluation<T>::evaluate(const std::string& expression)
   {
     std::set<T> result;
     // etc etc...
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...