模板模板参数特化基类后,访问成员变量报错求助
问题分析与解决方案:未声明标识符'_fun'的编译错误
你遇到的这个编译错误是C++模板继承里一个很容易踩的坑,核心原因和依赖基类的名称查找规则有关,咱们一步步拆解:
错误根源
你的Gun是一个模板类,它继承的Fun<S<Ts...>>是一个依赖于模板参数的基类——也就是说,基类的具体类型要等Gun模板实例化时才能确定。在编译模板定义阶段,编译器无法确定这个依赖基类里到底有没有_fun这个成员,所以直接写_fun会被当成未声明的标识符。
两种修复方案
方案1:用this->限定成员
通过this->_fun明确告诉编译器,这个成员来自当前类的基类,编译器就会去依赖基类中查找:
auto hun(){ std::cout << std::get<0>(this->_fun); }
方案2:用using声明引入基类成员
在Gun类中添加using声明,把基类的_fun成员引入到当前类的作用域里,这样就能直接使用了:
template<template<class...> class S, class... Ts, class P> struct Gun<S<Ts...>, P>: Fun<S<Ts...>>{ using Fun<S<Ts...>>::_fun; // 显式引入基类成员到当前作用域 auto hun(){ std::cout << std::get<0>(_fun); } };
完整修正后的代码
另外你的代码还缺少必要的头文件,我一起补上了:
#include <tuple> #include <iostream> template<class... Ts> struct typelist{}; template<class S> struct Fun; template<template<class...> class S, class... Ts> struct Fun<S<Ts...>> { std::tuple<Ts...> _fun; }; template<class S, class P> struct Gun; template<template<class...> class S, class... Ts, class P> struct Gun<S<Ts...>, P>: Fun<S<Ts...>>{ using Fun<S<Ts...>>::_fun; auto hun(){ std::cout << std::get<0>(_fun); } }; auto main(int /*argc*/, char* /*argv*/[])-> int { auto gun = Gun<typelist<int>, float>{}; gun.hun(); return 0; }
这样编译就能通过了,运行时会输出0(默认构造的std::tuple<int>第一个元素值为0)。
内容的提问来源于stack exchange,提问作者Slava
相关产品推荐
相关产品推荐

