繁体   English   中英

具有附加模板参数的C ++静态多态性/ CRTP访问基类成员

[英]c++ static polymorphism / CRTP with additional template parameters accessing base class member

我想使用CRTP实现静态多态性,并且还向模板参数添加其他类型。

提供以下方案,如何直接从派生类访问基本成员? 是否可以不指定Base类的完整类型?

#include <iostream>

template<class Derived, class X>
struct Base
{
    void set_a( int a ) { _a = a; }
    protected:
        int _a;
};

template<class X>
struct Derived: public Base<Derived<X>, X>
{
    int get_a( )
    {
        // return Base<Derived<X>,X>::_a; // This works!
        return _a; // error: use of undeclared identifier '_a'
    }
};

struct foo;

int main()
{
    Derived<foo> test;

    auto base_p = static_cast< Base<Derived<foo>, foo>* >( &test );
    base_p->set_a( 42 );

    int a = test.get_a();
    std::cout << a << std::endl;
}

g ++ 5.3.1 / clang ++ 3.8.0输出:

error: use of undeclared identifier '_a'

您可以在类中添加using声明:

template<class X>
struct Derived: public Base<Derived<X>, X> {

  using Base<Derived<X>, X>::_a;

  /* ... */

};

您仍然必须指定一次。

Derived范围中,不是声明_a而是继承了_a ,因此您必须编写_a this->_a来在基类中查找,或显式编写Base<Derived<X>, X>::_a 后者可以与

using Base<Derived<X>, X>::_a;

Derived的定义中。

tl; dr

如果this->_a写, this是自动向上转换到Base<Derived<X>, X>*相匹配的内在operator->

如果仅写入_a ,则将执行不合格的名称查找 不合格的名称查找是基于范围的,这与继承无关。 在您的示例中, _aDerived::get_a ,因此在_a中搜索

  • Derived::get_a
  • Derived
  • (文件范围)

未找到_a ,这将触发编译错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM