在我最近回顾的扩展 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->
即可解决该错误。
我的问题:
this->tree_type
部分,符合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’
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());
}
};