我已经在VS2005和VS2010上使用Crypto ++了一段时间了。但最近我需要直接使用它和应用程序。当我编译为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>;
编译参数是相同的,只是我看到的区别是项目中的配置类型(“Application(.exe)”生成错误,“Dynamic Library(.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
的调试版本,但没有声明放置新版本。
答案 0 :(得分:1)
你是#include <new>
,是否声明了placement-new的头文件?
答案 1 :(得分:0)
有趣的是,extern模板会告诉编译器在某些时候不 instantiante,所以第二个错误对我来说没有意义。您确定您的编译器是否支持extern模板?如果您执行相反的显式实例化会怎样:
template class Test<bool>;