继承模板有啥问题? [复制]

Posted

技术标签:

【中文标题】继承模板有啥问题? [复制]【英文标题】:What's wrong on inheritance template? [duplicate]继承模板有什么问题? [复制] 【发布时间】:2020-08-21 07:29:03 【问题描述】:

这是我的code:

#include <iostream>

struct Plot 
    float test;
    
    Plot() : test(1.0f) 
    
;

template <class T>
struct PlotTest : Plot 
    T *pModule;
    
    PlotTest(T *module) : Plot(), pModule(module) 

    
;

template <class T>
struct PlotTestCustom : PlotTest<T> 
    PlotTestCustom(T *module) : PlotTest<T>(module) 
        test = 2.0f;
    
;

int main()



但是当我编译时,PlotTestCustom 似乎看不到 float test; 变量(位于“主”父级上)。

我哪里错了?

【问题讨论】:

我建议将标题更改为“为什么无法在模板中访问公共基类成员?” 【参考方案1】:

在使用模板查找名称期间,它不会查看基类(例如,PlotTest 的特化可能不是从 Plot 继承的)。

因此你必须给编译器一个提示:

PlotTestCustom(T *module) : PlotTest<T>(module) 
    this->test = 2.0f;

这意味着通过将其设置为依赖名称来延迟查找直到实例化。

此处为完整示例:

#include <iostream>

struct Plot 
    float test;
    
    Plot() : test(1.0f) 
    
;

template <class T>
struct PlotTest : Plot 
    T *pModule;
    
    PlotTest(T *module) : Plot(), pModule(module) 
        test = 3.0; // accessible Plot is not a dependent base class
    
;

// specialization that does not inherit
template<>
struct PlotTest<int> 
;

template <class T>
struct PlotTestCustom : PlotTest<T> 
    PlotTestCustom(T *module) : PlotTest<T>(module) 
        this->test = 2.0f;
    
;

int main()

    double d;
    int i;
    PlotTestCustom<double> p1&d;
    //PlotTestCustom<int> p2&i; -> does not compile

【讨论】:

但是在PlotTest 内我可以在没有this 的情况下访问它。为什么? “例如,可能有一个不从 Plot 继承的 PlotTest 特化”嗯? PlotTest 将永远继承自 Plot: struct PlotTest : Plot @markzzz 非依赖名称不在依赖基类中查找,但 Plot 不是依赖基类 @markzzz 看这个例子:godbolt.org/z/csvq9n @markzzz 我顺便更新了我的答案【参考方案2】:

test 在这里不是从属名称,因此您必须通过 this 指针访问它,从而推迟实际查找,直到知道模板参数为止

coliru

【讨论】:

【参考方案3】:

你必须给编译器一个提示,在你的对象的哪个部分可以找到这个成员:

template <class T>
struct PlotTestCustom : PlotTest<T> 
    PlotTestCustom(T *module) : PlotTest<T>(module) 
        Plot::test = 2.0f;
    
;

【讨论】:

以上是关于继承模板有啥问题? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

html 元素上的 font-size: 100% 有啥作用? [复制]

OCP(开放封闭原则)与 IoC(控制反转)有啥关系?

extend模板继承

我的 Visual Studio 2008 模板有啥问题?

我的 Visual Studio 2008 模板有啥问题?

从 std::vector 继承的这个类声明有啥问题吗?