【发布时间】:2010-12-14 16:53:14
【问题描述】:
我有一个 Visual Studio 2008 C++ 项目,其中有一个继承自抽象基类的类和另一个在抽象基类中实现函数的模板类。例如:
class Foo;
struct Buzz
{
virtual ~Buzz() {};
virtual void Buzz_Do( Foo* ) = 0;
};
class Base
{
public:
virtual ~Base() {};
virtual void Base_Do( Buzz* ) = 0;
};
template< class T >
class Bar
{
public:
virtual void Base_Do( Buzz* v )
{
v->Buzz_Do( static_cast< T* >( this ) );
};
};
class Foo : public Base, public Bar< Foo >
{
};
int _tmain(int argc, _TCHAR* argv[])
{
Foo c;
return 0;
}
不幸的是,这会产生编译器错误:
1>MyApp.cpp(39) : error C2259: 'Foo' : cannot instantiate abstract class
1> due to following members:
1> 'void Base::Base_Do(Buzz *)' : is abstract
1> MyApp.cpp(17) : see declaration of 'Base::Base_Do'
我尝试将公共using Bar< Foo >::Base_Do; 添加到class Foo,但这没有帮助。
有没有办法完成这项工作,或者我需要在Foo 中放置一个具体的Base_Do() 实现而不使用Bar<>?
谢谢, 保罗H
【问题讨论】:
-
只是为了澄清术语:具有纯虚函数的类在 C++ 中称为 抽象类,而不是“虚拟基类”。
-
-1 不正确的断言,无效的代码。这不是您的实际代码,如果您的断言与现实有任何相似之处,那么呈现的代码不会。
标签: c++ templates compiler-errors