在c++的派生类构造函数中访问基模板类中的变量
Accessing variables from base template class in derived class constructor in C++
让我们看一下这个简单的代码示例,其中包括一个基类和一个从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
,那该怎么办?具体来说,from [temp.dep]:
在类或类模板的定义中,不检查依赖基类(14.6.2.1)的作用域在非限定名查找期间,在定义类模板或成员时或在此期间类模板或成员的实例化。
Base<T>
是一个依赖基类——它依赖于模板参数T
,因此在非限定名称查找期间不会检查它的作用域。解决这个问题的方法是使用限定的名称查找。也就是说,类名:
parr = &Base<T>::arr[0];
或仅使用this
:
parr = &this->arr[0];
在第二种情况下,Base
是一个模板,有人可能会为模板添加专门化,所有的都有不同的成员变量。编译器只有看到T
是什么才能知道。
也可能有一个全局的arr
可以适合。您可以通过使用this->arr[0]
来指示它始终是一个成员变量来帮助编译器。
相关文章:
- 没有用于初始化C++中的变量模板的匹配构造函数
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在类构造函数中使用结构变量
- 在 c++ 中将变量作为结构构造函数中的引用传递
- 在类构造函数中定义结构变量的参数
- 修改程序的入口点时未调用全局变量的构造函数
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 构造函数干扰成员变量指定的初始值设定项?
- 类中的数组变量C++导致"was not declared in this scope"实现文件的一个函数中错误,但在构造函数中不会导致错误
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- 我可以使用在类构造函数中初始化的流类型的成员变量吗?
- 为什么 std::move 不将默认移动构造函数中的源变量更改为默认值?
- C++为具有引用成员变量的类创建复制构造函数
- 带有常量构造函数参数的C++变量构造函数方法
- 全局变量构造函数/析构函数是否需要线程保护
- G++ 4.6 -std=gnu++0x:静态局部变量构造函数调用计时和线程安全
- 来自静态变量构造函数/析构函数的异常