模板类完全特化时无法访问原类私有成员的问题咨询
问题
我定义了如下模板类Reader:
template <typename T> class Reader { public: Reader(std::string& filename, uint dummy_sid = 0) {...}; bool isBroken() {return m_is_broken;} T getNext() {some operations; return m_event;} private: bool m_is_broken = false; uint m_dummy_sid = 0; T m_event; };
随后我创建了如下形式的完全特化类:
template<> class Reader<NAME_A> { public: Reader(std::string& filename, uint dummy_sid = 0) { m_dummy_sid = dummy_sid; m_in_file = std::ifstream(filename); } private: std::ifstream m_in_file; };
我希望在特化类中添加一个私有成员并重定义构造函数,但编译时提示m_dummy_sid未声明,请问我哪里出错了?
解答
- 完全特化类是独立的全新类,不继承原模板的成员:模板的完全特化版本和原模板类没有任何继承关系,原模板里的
m_dummy_sid不会自动成为特化类的成员。你在特化类构造函数中直接使用m_dummy_sid,但该变量并未在特化类中声明,所以编译器报错。 - 修复方法:如果需要在特化类中使用
m_dummy_sid,必须在特化类的私有成员区域重新声明该变量:
template<> class Reader<NAME_A> { public: Reader(std::string& filename, uint dummy_sid = 0) { m_dummy_sid = dummy_sid; m_in_file = std::ifstream(filename); } private: std::ifstream m_in_file; uint m_dummy_sid = 0; // 重新声明该成员变量 };
- 额外注意:如果特化类需要原模板类的其他成员函数(比如
isBroken()、getNext()),也必须在特化类中重新定义,因为完全特化类与原模板是完全独立的两个类。
内容的提问来源于stack exchange,提问作者Limone
相关产品推荐
相关产品推荐

