c++ - 在 C++ 的派生类构造函数中从基模板类访问变量

标签 c++ class templates inheritance constructor

让我们看一下这个简单的代码示例,包括一个基类和一个从 Base 派生的类,它需要在其构造函数中获取基类成员的地址。

#include <vector>
#include <inttypes.h>
#include <stdio.h>

class Base
{
protected:
  std::vector<uint32_t> arr;
public:
  Base(std::vector<uint32_t> arr_in): arr(arr_in) {}
};

class Derived: public Base
{
private:
  uint32_t *parr;
public:
  Derived(std::vector<uint32_t> arr_in): Base(arr_in)
  {
    parr = &arr[0];
  }

  uint32_t *get_parr();
};

uint32_t *Derived::get_parr(void)
{
  return parr;
}

int main()
{
  std::vector<uint32_t> myarr(3, 1);
  Derived myderived(myarr);
  printf("myderived.myarr adress = %p", myderived.get_parr());
}

由于派生类的构造函数先调用基类的构造函数,然后才执行其代码块,所以已经可以访问到基类的成员了。所以一切正常。

现在我更改代码示例,使我的两个类成为模板。

#include <vector>
#include <inttypes.h>
#include <stdio.h>

template<typename T>
class Base
{
protected:
  std::vector<T> arr;
public:
  Base(std::vector<T> arr_in): arr(arr_in) {}
};

template<typename T>
class Derived: public Base<T>
{
private:
  T *parr;
public:
  Derived(std::vector<T> arr_in): Base<T>(arr_in)
  {
    parr = &arr[0];
  }

  T *get_parr();
};

template<typename T>
T *Derived<T>::get_parr(void)
{
  return parr;
}

int main()
{
  std::vector<uint32_t> myarr(3, 1);
  Derived<uint32_t> myderived(myarr);
  printf("myderived.myarr adress = %p", myderived.get_parr() );
}

但是第二个示例在编译时给出了以下错误消息:

class_temp.cpp: In constructor ‘Derived<T>::Derived(std::vector<T>)’:
class_temp.cpp:23:13: error: ‘arr’ was not declared in this scope
     parr = &arr[0];

那么为什么在带有模板类的第二个示例中派生类构造函数不知道基类成员呢? 还是我在这里做错了什么?

谢谢。

最佳答案

arr现在是从属名称。这取决于 T .如果有一些 T 怎么办?为此 Base<T>专门没有 arr ?具体来说,来自 [temp.dep]:

In the definition of a class or class template, the scope of a dependent base class (14.6.2.1) is not examined during unqualified name lookup either at the point of definition of the class template or member or during an instantiation of the class template or member.

Base<T>是一个依赖基类——它依赖于模板参数 T ,因此在不合格 名称查找期间不会检查其范围。解决此问题的方法是使用限定 名称查找。也就是说,要么是类名:

parr = &Base<T>::arr[0];

或仅使用 this :

parr = &this->arr[0];

关于c++ - 在 C++ 的派生类构造函数中从基模板类访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48304547/

相关文章:

C++ 多态错误

c++ - 静态类成员是否保证在调用 `main` 之前被初始化?

c++ - 我们可以在类型上定义结构吗?

java - (Android Studio) (Java) 使用 A 类中的 ArrayList 在 B 类中构建的方法时遇到问题

c++ - 为什么 GCC 需要在模板中额外声明而 VS 不需要?

c++ - std::numeric_limits<T>::digits 应该代表什么?

python - Python 在实例化新类时返回什么?

c# - 将自定义类的数组存储在设置文件中

c++ - 指定默认模板参数

c++ - 友元函数声明中的尖括号是什么意思?