【问题标题】:left of '.push_back' must have class/struct/union'.push_back' 的左边必须有类/结构/联合
【发布时间】:2013-05-23 11:20:55
【问题描述】:

为什么我不能使用矢量?它没有初始化吗?我不能在静态函数中访问成员数据吗?

#include<iostream>
#include<boost/thread.hpp> 
#include<vector>
#include<boost/asio.hpp> 
#include <ctime>
#include <string>

using boost::asio::ip::tcp;

std::string make_daytime_string()
{
    using namespace std; // For time_t, time and ctime;
    time_t now = time(0);
    return ctime(&now);
}

class maintain_overlay{

public:
    maintain_overlay():thread_(&maintain_overlay::member_list_server)
    {
        thread_.join();
    }
    static void member_list_server(){
        boost::asio::io_service io_service;

        tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13));

        for (;;)
        {
            tcp::socket socket(io_service);
            acceptor.accept(socket);

            member_list.push_back(socket.remote_endpoint());

            std::string message = make_daytime_string();

            boost::system::error_code ignored_error;
            boost::asio::write(socket, boost::asio::buffer(message),
                boost::asio::transfer_all(), ignored_error);


        }
    }

private:
    std::vector<tcp::endpoint> member_list;
    boost::thread thread_;

};

-----编辑---

我的服务器想要维护所有传入 tcp 连接的列表? 做这个的最好方式是什么? 我应该将 member_list 声明为静态吗? 当我这样做时,我收到一个错误error LNK2001: unresolved external symbol

【问题讨论】:

    标签: c++ boost stl


    【解决方案1】:

    您的member_list_server() 函数是静态的,您正在尝试访问数据成员。

    这只有在您的成员函数不是静态的情况下才有可能,这样它就会收到一个隐式的 this 指针,在该指针上可以访问 member_list 数据成员。

    您应该使您的函数非静态并在构造您的 thread 对象时使用 boost::bind()

    #include <boost/bind.hpp>
    
    maintain_overlay()
        :
        thread_(boost::bind(&maintain_overlay::member_list_server, this))
    //          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    {
        thread_.join();
    }
    
    void member_list_server() {
    // ...
    }
    

    或者,如果这适合您的类的语义,您可以将member_list 设为静态数据成员。在这种情况下,不要忘记在命名空间范围内为其提供 定义

    class maintain_overlay
    {
        // ...
    private:
        static std::vector<tcp::endpoint> member_list; // DECLARATION
    //  ^^^^^^
    };
    
    std::vector<tcp::endpoint> maintain_overlay::member_list; // DEFINITION
    

    【讨论】:

    • 当我尝试将其设为静态时出现链接错误,你的意思是什么?在这种情况下,不要忘记在命名空间范围内为其提供定义?你能详细解释一下吗
    • 谢谢...修复了它,但我仍然不明白为什么在没有静态关键字的情况下定义外部有效?
    • @user494461:你什么意思?另外,如果这解决了您的问题,请考虑将答案标记为已接受:)
    • 我的意思是为什么静态成员需要在类之外定义,以便我们可以为它分配内存?非静态成员会自动初始化,对吗?
    • @user494461:嗯,这是一个非常不同的问题,我建议询问 SO(或寻找现有的问答)。简而言之,这是因为静态成员对于该类的所有实例都是全局的,因此必须存在它们的全局定义(极少数例外) - 编译器需要知道该对象的地址。
    【解决方案2】:

    member_list 不是static 变量,并且在static 成员函数member_list_server() 中被访问。 member_list 只能通过 maintain_overlay 的实例访问。

    使用boost::bind 的示例修复(Andy 首先发布,因为我必须在发布之前编译并确定):

    maintain_overlay() :
        thread_(boost::bind(&maintain_overlay::member_list_server, this))
    
    void member_list_server(){
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多