【问题标题】:Use cases of keyword using in C++11 [duplicate]C ++ 11中关键字使用的用例[重复]
【发布时间】:2019-01-25 15:56:15
【问题描述】:

我知道 C++11 中的 usingtypedef 的行为相同。我有这段代码,发现了不同的用例:

template<typename T, int a>
class Base
{
public:
     std::vector<T> noise_(a);
     using VectorType = std::vector<T>;
     virtual VectorType getVector() const
     {
        return noise_;
     }
protected:
     VectorType noise_;
};

template<typename T, int a> 
class Derived : public Base<T,a>
{
public:
    using Base<T,a>::noise_;
    using VectorType = typename Base<T,a>::VectorType; 
    using Base<T,a>::getVector;
};

在这里,using 以 3 种不同的方式使用。以下行的目的是什么(noise_ 是基类的受保护成员):

using Base<T,a>::noise_;

同样适用于:

using Base<T,a>::getVector;

【问题讨论】:

标签: c++ c++11 using


【解决方案1】:

简单地说,当基类依赖于模板参数时,不会检查其范围以解析名称。因此,您不能仅使用noise_ 来引用Derived 中的noise_。你应该写this-&gt;noise_,或者用using介绍名字。

【讨论】:

  • 你能否请这行,“当基类依赖于模板参数时,不检查其范围以解析名称”。
  • @TonyParker,我可以请什么吗?
  • 解释这一行
  • @TonyParker, Derived 有一个模板参数T(为简洁起见,我们省略a)并且派生自Base&lt;T&gt;,它依赖于相同的TBase&lt;T&gt; 的公共和受保护成员在 Derived 中可见,但您不能仅使用它们的名称访问它们,因为如果没有您的特殊指令,编译器将不会查看 Base&lt;T&gt; 范围。您应该写this-&gt;nameusing Base&lt;T&gt;::name。如果Base&lt;T&gt; 不依赖于T(例如,您从Base&lt;int&gt; 派生),则此规则不适用,并且Base 成员将可以在Derived 内部访问,而无需this-&gt;using。跨度>
猜你喜欢
  • 2021-01-27
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 2010-12-18
  • 2011-06-16
  • 2011-10-10
  • 2021-07-11
相关资源
最近更新 更多