gpt4 book ai didi

c++:在完全定义类之前使用类作为模板参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:17 24 4
gpt4 key购买 nike

我很难理解为什么以下代码段可以编译。我有一个模板类 ptr_to_member<T>它存储指向 T 的成员函数的指针.然后我正在创建一个新类 my_class它有一个 ptr_to_member<my_class> .鉴于 my_class,我预计后者会导致编译错误仍在定义中。任何帮助表示赞赏。谢谢。

#include <iostream>

// this class simply stores a pointer to a member function of T
template <class T>
struct ptr_to_member {

using ptr_type = void (T::*)();
ptr_type m_ptr;

ptr_to_member()
: m_ptr(&T::f){}

auto get_ptr() const {
return m_ptr;
}
};

// my_class has a ptr_to_member<my_class>
class my_class {

ptr_to_member<my_class> m_ptr_to_member; // why does this compile?

public:

void g() {
auto ptr = m_ptr_to_member.get_ptr();
(this->*ptr)();
}

void f() {
std::cout << "f" << std::endl;
}
};

int main() {

my_class x;
x.g();

}

最佳答案

在定义类时,可以像前向声明一样使用该类。由于 ptr_to_member 只使用指向 T 的指针,直到您实例化它的方法之一,所以它不会提示。尝试添加成员 T 而不是指针,您会发现它失败了。直观的理解方式是,您不需要知道T 是什么就可以使用T 的指针,只需知道T 是一种。指针的行为方式相同,无论它们指向什么,直到您取消引用它们。

template <class T>
struct ptr_to_member {

using ptr_type = void (T::*)();
ptr_type m_ptr;

ptr_to_member()
: m_ptr(&T::f) {}

auto get_ptr() const {
return m_ptr;
}

T member; // Add this and see that it fails to compile
};

参见 this answer有关何时可以和不可以使用前向声明类型的更多信息。

关于c++:在完全定义类之前使用类作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41579920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com