extern模板DLL和程序(crypto ++)

时间:2011-06-14 14:35:21

标签: visual-c++ c++11 operator-overloading

我已经在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的调试版本,但没有声明放置新版本。

2 个答案:

答案 0 :(得分:1)

你是#include <new>,是否声明了placement-new的头文件?

答案 1 :(得分:0)

有趣的是,extern模板会告诉编译器在某些时候 instantiante,所以第二个错误对我来说没有意义。您确定您的编译器是否支持extern模板?如果您执行相反的显式实例化会怎样:

template class Test<bool>;