次のスニペットがコンパイルされる理由を理解するのが苦労しています。私はテンプレートクラスptr_to_member<T>
を持っていて、メンバー関数へのポインタはT
です。私はptr_to_member<my_class>
を持つ新しいクラスmy_class
を作成しています。私は、my_class
が依然として定義されているので、後者がコンパイルエラーを引き起こすことを期待していました。どんな助けもありがとうございます。ありがとうございました。C++:クラスが完全に定義される前に、テンプレート引数としてのクラスの使用
#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();
}
'my_class'がその定義内で不完全な型であるとすれば、私はポインタや参照を使用することしか許されておらず、メソッドは使用できないと考えました。だから私が 'my_class'へのポインタを持っていれば、' my_class'が定義される前に 'my_class_ptr-> f()'を使うことができません。したがって、 'ptr_to_member'のコンストラクタで'&T :: f'を使用すると問題が生じることを期待していました...何が欠けていますか? – linuxfever
この場合のテンプレートは赤ん坊です。メソッドの定義は、クラス宣言が完了した後でのみ調べられます。私は[この回答](http://stackoverflow.com/a/13095136/7359094)は私がコメントでできるよりもそれを説明できると思います。 –
ありがとう、私は今それを得ると思います – linuxfever