模板部分专用化阻止从派生类进行初始化
template partial specialization prevents initialization from derived class
我从一个具有部分专门化的模板继承,并且我不能从派生的ctor调用模板ctor。
当下面代码中的部分专用化被注释掉时,它编译时没有任何错误或警告。
#include <iostream>
typedef enum {supertype, subtype} selector;
template< typename T, selector s>
class Tmpl {
protected:
T* root;
public:
Tmpl( T* t = 0 ) {
root = t;
}
T listHead( ) {
std::cout << "template listHead() called" << std::endl;
}
};
class Descriptor {
public:
Descriptor( const char * s ) {
std::cout << "Descriptor " << s << std::endl;
}
};
// partial specialization - if uncommented, errors
// are reported at the supertypesIterator ctor below.
/*
template<selector s>
class Tmpl<Descriptor, s> {
public:
Descriptor listHead( ) {
switch( s ){
case supertype:
return Descriptor("Supertypes");
case subtype:
return Descriptor("Subtypes");
}
}
};
*/
class supertypesIterator : public Tmpl<Descriptor, supertype> {
public:
supertypesIterator( Descriptor* t = 0 ):Tmpl<Descriptor, supertype>(t) {}
};
main() {
supertypesIterator s;
s.listHead();
}
如果我取消注释专业化,我会得到以下错误:
$g++ trouble.cc
trouble.cc: In constructor ‘supertypesIterator::supertypesIterator(Descriptor*)’:
trouble.cc:43:74: error: no matching function for call to ‘Tmpl<Descriptor, (selector)0u>::Tmpl(Descriptor*&)’
trouble.cc:43:74: note: candidates are:
trouble.cc:27:7: note: Tmpl<Descriptor, (selector)0u>::Tmpl()
trouble.cc:27:7: note: candidate expects 0 arguments, 1 provided
trouble.cc:27:7: note: Tmpl<Descriptor, (selector)0u>::Tmpl(const Tmpl<Descriptor, (selector)0u>&)
trouble.cc:27:7: note: no known conversion for argument 1 from ‘Descriptor*’ to ‘const Tmpl<Descriptor, (selector)0u>&’
我需要做什么才能从supertypesIterator
ctor中初始化基类?
我使用的是g++版本4.7.1
,不过我也需要它来跨平台工作。
您必须在专业化中实现缺少的构造函数。否则,supertypesIterator
的构造函数正试图调用一个不存在的Tmpl
的构造函数。
template<selector s>
class Tmpl<Descriptor, s> {
Descriptor* root;
public:
Tmpl( Descriptor* t = 0 ) {
root = t;
}
Descriptor listHead( ) {
switch( s ){
case supertype:
return Descriptor("Supertypes");
case subtype:
return Descriptor("Subtypes");
}
}
};
相关文章:
- 何时为派生类初始化 vptr?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 为什么基类数据在派生类数据之前初始化
- C++初始化之前派生类调用基类的方法
- std::数组派生类聚合初始化
- 如何使用派生类类型数据初始化 std::shared_ptr?
- 将已初始化的基类分配给派生类
- 在派生类的构造函数初始化中无法访问受保护的函数
- OOP - 抽象类类型,初始化基类和派生类中的变量
- C :适当的格式以初始化派生和基础
- 初始化 MFC 中 CFormView 派生类的成员数据
- 派生类的聚合初始化
- 初始化基类和派生类中的类成员变量
- C++派生类的初始化列表
- C++ - 在派生类中静态初始化受基类保护的成员变量
- 为什么派生类成员的初始化值在转换为基指针时不会丢失?
- 如何在派生类中初始化继承的模板POD结构
- 如何在 switch 语句中正确初始化不同的派生类
- 如何在派生构造函数的大括号中初始化基构造函数?C++
- 用派生的类构造函数初始化对象