我在其他人的代码中遇到了以下问题,大概是在某个时候编译。基类是 T 类型数据成员的通用容器。该数据成员protected
仅在以 为前缀时在派生类的重写函数中可见this->
。下面的简化示例在我的机器上以及在 code::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
在 g++4.6.3 上编译使用的.cpp
文件会Derived.h
导致以下错误:
在 main.cpp:3:0 包含的文件中:Derived.h:在成员函数“virtual void Derived::show()”中:Derived.h:18:15:错误:“值”未在此范围内声明
但是,只需更改std::cout << value << std::endl;
即可std::cout << this->value << std::endl;
解决问题。即使对于不是 T 类型的数据成员,也会观察到相同的行为。
这是预期的行为吗?我想不会,因为遗留代码肯定会在某个时候编译。