C++ C++;-使用父类属性

C++ C++;-使用父类属性,c++,class,templates,attributes,polymorphism,C++,Class,Templates,Attributes,Polymorphism,我正在编写一个通用的Vector类,我想要一个Vector3类从Vector继承。Vector的数据可以是任意长度,Vector3的数据长度为3。所以我想为Vector3创建一个不同的构造函数,它访问向量的数据和长度。对于这个问题,我简化了代码 #include <iostream> template <typename T> class A { protected: T value; public: A() : value(0) {

我正在编写一个通用的Vector类,我想要一个Vector3类从Vector继承。Vector的数据可以是任意长度,Vector3的数据长度为3。所以我想为Vector3创建一个不同的构造函数,它访问向量的数据和长度。对于这个问题,我简化了代码

#include <iostream>


template <typename T>
class A {
protected:
    T value;

public:
    A()
    : value(0)
    {};

    A(T value)
    : value(value)
    {};

    ~A ()
    {};

    T get_value()
    {
        return value;
    }
};

template <typename T>
class B : public A<T> {
public:
    B()
    : A<T>(3)
    {};

    T test()
    {
        return value; // error: 'value' was not declared in this scope
    }
};
#包括
模板
甲级{
受保护的:
T值;
公众:
()
:值(0)
{};
A(T值)
:值(value)
{};
~A()
{};
无法获取_值()
{
返回值;
}
};
模板
B类:公共A{
公众:
B()
:A(3)
{};
T检验()
{
返回值;//错误:未在此作用域中声明“value”
}
};
正如我所说,我想访问子类“B”中的“value”,但是我收到了错误通知

错误:“值”未在此范围内声明

但是根据C++网站(),我应该能够访问“值”。
<>这是为什么,更重要的是,我如何解决这个问题?

< P>这是一个粘性的C++。由于您继承的是
A
,而不是
A
,因此默认情况下,成员名称不可见。它们被称为非依赖名称,因为它们不依赖于模板参数。我通常导入要显式使用的成员:

template <typename T>
class B : public A<T> {
   using A<T>::value;
public:
    B()
    : A<T>(3)
    {};

    T test()
    {
        return value; // error: 'value' was not declared in this scope
    }
};
模板
B类:公共A{
使用A::值;
公众:
B()
:A(3)
{};
T检验()
{
返回值;//错误:未在此作用域中声明“value”
}
};

<代码> > p>这是一个粘性的C++。由于您继承的是
A
,而不是
A
,因此默认情况下,成员名称不可见。它们被称为非依赖名称,因为它们不依赖于模板参数。我通常导入要显式使用的成员:

template <typename T>
class B : public A<T> {
   using A<T>::value;
public:
    B()
    : A<T>(3)
    {};

    T test()
    {
        return value; // error: 'value' was not declared in this scope
    }
};
模板
B类:公共A{
使用A::值;
公众:
B()
:A(3)
{};
T检验()
{
返回值;//错误:未在此作用域中声明“value”
}
};

<代码>你在C++上下文中使用这个术语不正确。我强烈推荐阅读。一开始可能很难阅读,但当你不只是在寻找快速修复,而是真正理解名字是如何被查找时,尤其是在处理模板时。你在C++上下文中使用这个术语是错误的。我强烈推荐阅读。一开始可能很难阅读,但当您不仅仅是在寻找快速解决方案,而是真正了解如何查找名称时,尤其是在处理模板时,它确实很有用。好的,但我应该每次从a或B继承时都这样做吗?遗产应该让生活更早,对吗?没有更多的困难,您每次定义从继承的类时都必须这样做,但在使用它们时就不需要这样做了,所以这并不是真正的负担。您也可以通过
this
指针访问成员。好的,但我应该每次从A或B继承时都这样做吗?遗产应该让生活更早,对吗?没有更多的困难,您每次定义从继承的类时都必须这样做,但在使用它们时就不需要这样做了,所以这并不是真正的负担。您还可以通过
指针访问成员。