【发布时间】:2012-03-27 09:45:14
【问题描述】:
我对使用类和函数作为参数的模板有疑问。 问题是,当仅声明和定义 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
好像编译器把不同的模板混在一起了,不是吗?
提前感谢您的帮助
【问题讨论】:
-
我没有看到静态成员的定义。并不是说它会导致您发布的错误。或者,这可能是导致问题的原因。
-
if (!ms_Singleton) new BBInterceptor();缺少一个作业顺便说一句。 -
我刚刚添加了
#include <cassert>并且在 VS2010 中编译的一切都很好。 -
Nawaz & Mat:好的thanx,我编辑了我的帖子,并在基本构造函数中添加了赋值。但问题仍然存在。 OmarOthman:我在 VS2008 中尝试过#include
(我的项目只有 2008 年),但它并没有成功...... :(
标签: c++ templates compiler-errors singleton functor