泛型类中的继承数据成员在派生类中不可见,除非前缀为this->

时间:2013-09-26 08:11:40

标签: c++ generics inheritance g++ visibility

我遇到了以下问题,其他人的代码可能在某些时候正在编译。基类是类型为T的数据成员的通用容器。此数据成员为protected,但只有在前缀为this->的派生类'重写函数中才可见。以下简化示例复制了我的机器上以及代码:: blocks 12.11中包含的当前分布式MinGW版本上的问题

Base.h

#ifndef BASE_H
#define BASE_H

template <typename T>
class Base
{
   public:
    void set(T value);
    virtual void show() = 0;
   protected:
    T value;
};

template <typename T>
void Base<T>::set(T value)
{
   this->value = value;
}

#endif

Derived.h

#ifndef DERIVED_H
#define DERIVED_H

#include <iostream>

#include "Base.h"

template <typename T>
class Derived : public Base<T>
{
   public:
    virtual void show();
};

template <typename T>
void Derived<T>::show()
{
    std::cout << value << std::endl;
}

#endif

编译使用.cpp的{​​{1}}文件会导致g ++ 4.6.3出现以下错误:

  

main.cpp中包含的文件:3:0:   Derived.h:在成员函数'virtual void Derived :: show()'中:   Derived.h:18:15:错误:'value'未在此范围内声明

但是,只需将Derived.h更改为std::cout << value << std::endl;即可解决问题。即使数据成员不是T类,也会观察到相同的行为。

这是预期的行为吗?我想象的不是因为遗留代码肯定在某些时候编译。

0 个答案:

没有答案