gpt4 book ai didi

c++ - 前向声明方法指针

转载 作者:太空狗 更新时间:2023-10-29 20:32:53 26 4
gpt4 key购买 nike

我正在使用 pimpl 惯用语并想引用前向声明类的方法之一。下面不是我正在做的,但使用了相同的概念。

template< typename Class, void (Class::*Method)(void) >
struct Call
{
Call( Class* c )
: m_c(c)
{ }

void operator()( void )
{
(m_c->*Method)();
}

Class* m_c;
};

class A
{
public:
void foo( void )
{
std::cout << "A::foo\n";
}
};

// this works
void do_foo( A* a )
{
Call<A,&A::foo> c(a);
c();
}

class B;
// this doesn't compile
extern void B::bar( void );

// this is what i'd ultimately like to do
void do_bar( B* b )
{
Call<B,&B::bar> c(b);
c();
}

两个问题:

  • 这可以做到吗?
  • 为什么做不到?

最佳答案

您不能前向声明一个成员函数。我认为原因是,当您在指向 B 的指针上调用函数时,编译器必须将 this 指针传递给该方法。但它还不知道 B 的精确类层次结构。因此,此时不可能对该指针进行可能的调整(例如,由于该方法是虚拟的)。编译器也不知道该方法具有什么可见性。毕竟,它可能是私有(private)的,你不能从外面调用它。声明该成员函数的唯一方法是定义类,然后在该定义中声明该函数。解决问题的另一种方法是改为声明自由函数:

class B;
void do_bar( B* b );

然后在一个文件中定义 do_bar,您可以在其中安全地包含类 B 的定义。

关于c++ - 前向声明方法指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/399452/

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