为何无法在C++模板特化中使用模板成员?
问题分析与解决方案
你的代码报错是因为完全特化的Foo<int>是独立的结构体类型,和原模板template<typename T> Foo没有继承关系,原模板里的DataMember不会自动出现在特化版本中,所以编译器找不到这个标识符。
下面提供两种可行的解决方法:
方法1:在特化版本中显式声明成员
直接在Foo<int>里添加和原模板一致的DataMember,简单直接:
#include <iostream> template <typename T> struct Foo { public: T DataMember; }; template<> struct Foo<int> { public: int DataMember; // 显式声明该成员 void bar() { std::cout << DataMember; } };
方法2:通过基类复用公共成员
把原模板的公共成员抽离到基类中,让通用模板和特化版本都继承这个基类,避免代码重复:
#include <iostream> // 公共基类,存放所有版本都需要的成员 template <typename T> struct FooBase { T DataMember; }; // 通用模板继承基类 template <typename T> struct Foo : public FooBase<T> { }; // 特化版本继承基类,即可直接使用DataMember template<> struct Foo<int> : public FooBase<int> { void bar() { std::cout << this->DataMember; // 需用this->访问基类模板成员 } };
注意:在方法2中,访问基类模板的成员时需要加上this->,否则编译器可能无法识别该成员来自基类模板。
内容的提问来源于stack exchange,提问作者Serhii Horbanov
相关产品推荐
相关产品推荐

