Singleton模板专业化编译的奇怪错误
Weird error of compilation of template specialization of Singleton
我对使用类和函数作为参数的模板有问题。问题是,当只声明和定义AAInterceptor时,它可以正常工作。当我添加BBInterceptor时,有一个编译错误,看起来很奇怪。
这是代码
template< class T>
class Singleton
{
protected:
static T* ms_Singleton;
Singleton()
{
if(!ms_Singleton)ms_Singleton = new T;
}
public:
static T& getSingleton( void ){assert( 0); return *ms_Singleton; }
};
struct InterceptorData
{
unsigned int flag;
InterceptorData():flag(0){}
};
template <class C, void (C::*TMethod)(const InterceptorData*)>
class InterceptorManager : public Singleton< InterceptorManager<C,TMethod> >
{
};
class AClass
{
public:
virtual void Amethod(const InterceptorData* p_data = 0){};
};
class AAInterceptor : public InterceptorManager<AClass, &AClass::Amethod>
{
public:
static AAInterceptor& getSingleton(void)
{
if (!ms_Singleton) new AAInterceptor();
assert( ms_Singleton );
return ( *(static_cast< AAInterceptor*>(ms_Singleton)) );
}
};
class BClass
{
public:
virtual void Bmethod(const InterceptorData* p_data = 0){};
};
class BBInterceptor : public InterceptorManager<BClass, &BClass::Bmethod>
{
public:
static BBInterceptor& getSingleton(void)
{
if (!ms_Singleton) new BBInterceptor();
assert( ms_Singleton );
return ( *(static_cast< BBInterceptor*>(ms_Singleton)) ); //Here is the error of compilation
}
};
int main(void)
{
AAInterceptor a;
BBInterceptor b;
return 0;
}
它与GCC配合良好(http://codepad.org/Bi6zbsmq),但MSVC2008没有。
这是Visual Studio中的错误:
error: " error C2440: 'static_cast' : cannot convert from 'InterceptorManager<C,TMethod> *' to 'BBInterceptor *' " 58
with
1> [
1> C=BClass,
1> TMethod=void AClass::`vcall'{0}'(const InterceptorData *)
1> ]
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
编译器似乎把不同的模板混合在一起,不是吗?
提前感谢您的帮助
此代码不会导致编译器错误,只需将虚拟调用封装到非虚拟函数中并获取其地址即可。
template<typename T>
class Singleton
{
protected:
static T* ms_Singleton;
Singleton()
{
if(!ms_Singleton)ms_Singleton = new T;
}
public:
static T& getSingleton( void ){assert(0); return *ms_Singleton; }
};
template<typename T>
T* Singleton<typename T>::ms_Singleton = 0;
struct InterceptorData
{
unsigned int flag;
InterceptorData():flag(0){}
};
template <typename C, void (C::*TMethod)(const InterceptorData*)>
class InterceptorManager : public Singleton< InterceptorManager<C,TMethod> >
{
};
class AClass
{
public:
void Amethod(const InterceptorData* p_data = 0){AmethodImpl(p_data);};
virtual void AmethodImpl(const InterceptorData* p_data = 0){};
};
class AAInterceptor : public InterceptorManager<AClass, &AClass::Amethod>
{
public:
static AAInterceptor& getSingleton(void)
{
if (!ms_Singleton) new AAInterceptor();
assert( ms_Singleton );
return ( *(static_cast< AAInterceptor*>(ms_Singleton)) );
}
};
class BClass
{
public:
void Bmethod(const InterceptorData* p_data = 0){BmethodImpl(p_data);};
virtual void BmethodImpl(const InterceptorData* p_data = 0){};
};
class BBInterceptor : public InterceptorManager<BClass, &BClass::Bmethod>
{
public:
static BBInterceptor& getSingleton(void)
{
if (!ms_Singleton) new BBInterceptor();
assert( ms_Singleton );
return ( *(static_cast< BBInterceptor* >(ms_Singleton)) );
}
};
int main(void)
{
AAInterceptor a;
BBInterceptor b;
return 0;
}
相关文章:
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- std::is_base_of表示ctor编译错误
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- Qt Cmake 错误编译"GuiSupportQt not found"
- Opengl 精度转换错误编译错误 E0415
- 库将ARM架构错误编译为架构X64
- RT 音频 Mac 错误 g++ 编译错误
- 错误编译Boost.log
- 错误编译QT创建者 / QT窗口小部件示例
- 错误编译MIPS32
- Visual Studio 2013 中的错误(编译和运行代码)
- 链接错误编译qt项目在visual 2010
- 无法用模板错误编译nsgmls
- 奇怪的错误.编译失败
- 如果有人调用c++中的方法,则强制错误(编译时)
- 来自autoconf测试的错误编译命令
- 时间限制超出错误C++编译
- SFML 2.3 和 CodeBlocks 错误编译