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/32399844/

相关文章:

java - ClassLoader.defineClass 上出现 NoClassDefFoundError (名称错误)

c++ - 在没有类实例的情况下调用 C++ 类方法?

javascript - 使用多个下拉菜单更改 p 标签类

c++ - 为什么我不能为构造函数使用别名类型? C++

C++ - 为任何 lambda 创建实例化桶

c++ - 为什么 void* 在 C++ 中被认为是不安全的?

c++ - 是否应该避免未命名的命名空间函数以减少符号表的大小?

c++ - 在 C++ 中使用 fread 从二进制文件中读取字符串及其长度

c++ - 可以消除这个基类构造函数吗?

c++ - gmock基类的构造器实例化与另一个实例