3

我在其他人的代码中遇到了以下问题,大概是在某个时候编译。基类是 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 类型的数据成员,也会观察到相同的行为。

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

4

0 回答 0