Я уже некоторое время использую 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
, но не объявил новую версию для размещения.