【发布时间】:2013-12-11 08:06:13
【问题描述】:
为什么下面代码中的 TemplateChild 不起作用?我知道虚方法不能是模板,但是为什么显式实例化的模板方法不能覆盖虚方法呢?
#include <iostream>
class VirtBase
{
public:
VirtBase() {};
virtual ~VirtBase() {};
virtual void method( int input ) = 0;
virtual void method( float input ) = 0;
};
class RegularChild : public VirtBase
{
public:
RegularChild() {};
~RegularChild() {};
void method( int input ) {
std::cout << "R" << input << std::endl;
}
void method( float input ) {
std::cout << "R" << input << std::endl;
}
};
class TemplateBounceChild : public VirtBase
{
public:
TemplateBounceChild() {};
~TemplateBounceChild() {};
void method( int input ) {
this->method<>( input );
}
void method( float input ) {
this->method<>( input );
}
template< typename INPUT >
void method( INPUT input ) {
std::cout << "B" << input << std::endl;
};
};
class TemplateChild : public VirtBase
{
public:
TemplateChild() {};
~TemplateChild() {};
template< typename INPUT >
void method( INPUT input ) {
std::cout << "T" << input << std::endl;
};
};
template void TemplateChild::method< int >( int );
template void TemplateChild::method< float >( float );
int main( int, char**, char** )
{
int i = 1;
float f = 2.5f;
VirtBase * v;
RegularChild r;
v = &r;
r.method( i );
r.method( f );
v->method( i );
v->method( f );
TemplateChild c; // TemplateBounceChild here works correctly.
v = &c;
c.method( i );
c.method( f );
v->method( i );
v->method( f );
return 0;
}
gcc 4.4.7 (CentOS 6) 和 Clang 3.3 (trunk 177401) 同意这两个纯虚方法没有在 TemplateChild 中实现,尽管在编译时 TemplateChild 显式地有一个名为 'method' 的方法,它需要一个float,以及一个名为“method”的方法,它采用 int。
仅仅是因为显式实例化来得太晚,TemplateChild 被认为是非纯虚拟的吗?
编辑:C++11 14.5.2 [temp.mem]/4 表示这不适用于专业化。但是我在 [temp.explicit] 部分中找不到任何关于同一件事的明确内容。
4 A specialization of a member function template does not override a virtual function from a base class.
我还编辑了 TemplateBounceChild 以匹配 C++11 草案的该部分中使用的示例。
【问题讨论】:
标签: c++ templates virtual-inheritance