我遇到了以下问题,其他人的代码可能在某些时候正在编译。基类是类型为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类,也会观察到相同的行为。
这是预期的行为吗?我想象的不是因为遗留代码肯定在某些时候编译。