`member_variable.a_type::b_type::static_function()`符合C++标准吗?

问题描述 投票:0回答:1

在我最近回顾的扩展 boost.intrusive 库的项目中,我在类中遇到了以下代码

treap_impl

node_ptr this_head(this->tree_type::header_ptr());
node_ptr right(this->tree_type::node_algorithms::root_node(this_head));

有问题的代码在 MSVC 17.9 上编译,但不使用 clang 或 gcc,因为第二行出现错误:

...::node_algorithms is not a base of treap_impl<...>

从第二行删除

this->
即可解决该错误。

我的问题:

  1. 这段代码,特别是
    this->tree_type
    部分,符合C++标准吗?
  2. C++ 标准的哪一部分与此处相关?
  3. 我是否忽略了一些非常基本的 C++ 知识?

这里是一个在 gcc 和 clang 上重现相同错误的示例。这也无法在编译器资源管理器上使用 MSVC 进行编译。遗憾的是,我不确定如何重现上述的确切设置,即使用 MSVC 进行编译所需的内容,而不是使用 gcc/clang 进行编译。

struct static_thing {
  static int value() {
    return 5;
  }
};

struct A {
  using the_type = static_thing;
};

class B {
  using a_type = A;

  void do_stuff() {
    int a(this->a_type::the_type::value());
  }
};

有问题的错误:

error: ‘A::the_type’ {aka ‘static_thing’} is not a base of ‘B’
c++ language-lawyer standards boost-intrusive
1个回答
0
投票

this->a_type::the_type::value()
表示“在基类 value 上找到一个名为
a_type::the_type
方法
,并使用隐藏参数
this
调用它。

这与单独的

a_type::the_type::value()
不同,在该上下文中,它也可能具有相同的含义,但也具有其他重载“在命名空间 value 中查找名为
a_type::the_type
函数 
并在不带参数的情况下调用它”。

至于编译器理解/想要什么:

struct static_thing {
  static int value() {
    return 5;
  }
};

struct A {
  using the_type = static_thing;
};

// There is now value() from static_thing as a member on B
// static_thing is additionally known by the alias a_type::the_type
class B : public static_thing {
  using a_type = A;

  void do_stuff() {
    int a(this->a_type::the_type::value());
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.