我有以下代码,但编译器说sender_wrapper是未定义的,即使我转发声明了它。我可以不做结构的前向声明吗? (用VS2003编译)
struct send_wrapper;
struct IPSend
{
IPSend::IPSend(const send_wrapper& sender) : _sender(sender) {}
void IPSend::operator()(const std::string& msg)
{
if (!msg.empty())
_sender.send(msg);
}
send_wrapper _sender; //error C2079: 'IPSend::_sender' uses undefined struct 'send_wrapper'
};
struct send_wrapper
{
std::auto_ptr<tcp_server> server;
};
答案 0 :(得分:21)
类型的前向声明只能用于解析涉及指针和引用的声明到该类型。
在完全定义类型之前,编译器对类型一无所知;例如它有什么成员,或者它有多大。因此,您不能将它用作结构的按值成员,因为编译器不知道它有多大,或者它的构造函数和析构函数是公共的。另一方面,您可以自由地执行send_wrapper *_p_sender;
之类的操作,因为指向结构的指针总是相同的大小。但是你仍然无法访问其成员函数等。
答案 1 :(得分:4)
我可以不进行结构的前向声明吗?
是的,但仅限于此类struct
的引用和指针。一旦你开始在它内部进行戳,比如访问它的成员,你需要struct
的完整声明 - 否则,编译器如何知道你的发送者有send()
函数?