внешние шаблоны DLL и программ (crypto ++) - PullRequest
0 голосов
/ 14 июня 2011

Я уже некоторое время использую Crypto ++ с VS2005 и VS2010.Но недавно мне нужно было использовать его с приложением напрямую.Тот же код компилируется нормально, когда я компилирую как DLL, и не компилируется при компиляции как приложение.

Это наименьший пример, который воспроизводит ошибку (основано на cryptopp561\algparam.h:301 CryptoPP::AlgorithmParametersTemplate

class Base 
{
protected:
    virtual void MoveInto(void *p) const = 0;
};

template<class T>
class Test: public Base
{
public:
    void MoveInto(void * buffer) const
    {
        Test<T> *x = new(buffer) Test<T>(*this);
    }
};

extern template class Test<bool>;

Параметры компиляции одинаковы, единственное отличие, которое я видел, было в том, что тип конфигурации в проекте («Приложение (.exe)» генерирует ошибку, а «Динамическая библиотека (.dll)» - нет).

Это ошибка компилятора:

main.h(15): error C2061: syntax error : identifier 'buffer'
      main.h(14) : while compiling class template member function 'void Test<T>::MoveInto(void *) const'
      with
      [
          T=bool
      ]
      main.h(20) : see reference to class template instantiation 'Test<T>' being compiled
      with
      [
          T=bool
      ]

Кажется, это происходит только при наследовании. Пропуск : public Base в объявлении class Test устраняет ошибку.

РЕДАКТИРОВАТЬ: Проблема была в заголовке, который где-то определил отладочную версию для operator new, но не объявил новую версию для размещения.

Ответы [ 2 ]

1 голос
/ 14 июня 2011

Вы #include <new>, заголовочный файл, который объявляет новое место размещения?

0 голосов
/ 14 июня 2011

Как ни странно, внешние шаблоны должны указывать компилятору , а не instantiante в какой-то момент, поэтому вторая ошибка не имеет смысла для меня.Вы уверены, что ваш компилятор поддерживает внешние шаблоны?Что если вы сделаете обратное, явное создание экземпляра:

template class Test<bool>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...