Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 还有一个未定义的引用错误_C++_Oop - Fatal编程技术网

C++ 还有一个未定义的引用错误

C++ 还有一个未定义的引用错误,c++,oop,C++,Oop,我很高兴地编码,认为一切都很好,直到 libtool: link: g++ -g -O2 -o bbcp bbcp-main.o bbcp-server.o bbcp-client.o bbcp-client_manager.o bbcp-bbcp.pb.o -pthread -lconfig++ /usr/lib/libprotobuf.so -lz -lpthread -lglog -L/usr/lib -lboost_thread-mt -lboost_system -pthread b

我很高兴地编码,认为一切都很好,直到

libtool: link: g++ -g -O2 -o bbcp bbcp-main.o bbcp-server.o bbcp-client.o bbcp-client_manager.o bbcp-bbcp.pb.o -pthread  -lconfig++ /usr/lib/libprotobuf.so -lz -lpthread -lglog -L/usr/lib -lboost_thread-mt -lboost_system -pthread
bbcp-client_manager.o: In function `BBCP::Server::ClientManager::send_message(boost::shared_ptr<BBCP::Server::Client>, BBCP::Protocol::Message const&)':
/home/eax/BBCP/src/client_manager.cpp:63: undefined reference to `void BBCP::Server::Client::sendPacket<BBCP::Protocol::Message>(BBCP::Protocol::PacketType, BBCP::Protocol::Message const&)'
collect2: ld returned 1 exit status
此函数在
BBCP::Server::Client
中的定义方式与公共成员相同

一如往常,任何帮助都将不胜感激


只要你在对应的源文件中显式地实例化模板,C++源中的[FARE]函数模板的定义就可以了。仅仅让成员函数模板在一个源中定义并在另一个源中使用是行不通的。您可以尝试在成员函数模板的定义之后添加以下内容:

template void BBCP::Server::Client::sendPacket<BBCP::Protocol::Message>(
    BBCP::Protocol::PacketType, BBCP::Protocol::Message const &packet);
模板无效BBCP::Server::Client::sendPacket(
BBCP::Protocol::PacketType,BBCP::Protocol::Message const&packet);

当然,这里假设
BBCP::Protocol::Message
是在这一点上定义的。

@AndrejsCainikovs那么帮助呢?@Pubby你是什么意思?模板在客户端头文件中声明。@JulianBayardoSpadafora:使用名称空间或以更可读的方式重新设计。
template<class T>
void BBCP::Server::Client::sendPacket(enum BBCP::Protocol::PacketType type, T const &packet) {
    std::vector<unsigned char> pbuffer;
    BBCP::Protocol::Header header;

    header.set_type(type);
    header.set_length(packet.ByteSize());
    pbuffer.resize(BBCP_HDR_MSG_SIZE + packet.ByteSize());

    if (!header.SerializeToArray(&pbuffer[0], BBCP_HDR_MSG_SIZE)) {
        LOG(ERROR) << "Header of type " << type << " and length " << packet.ByteSize() << " failed to serialize to array. Send aborted.";
    }
    else if (!packet.SerializeToArray(&pbuffer[BBCP_HDR_MSG_SIZE], packet.ByteSize())) {
        LOG(ERROR) << "Packet of type " << type << " and length " << packet.ByteSize() << " failed to serialize to array. Send aborted.";
    }
    else {
        boost::asio::async_write(*socket, boost::asio::buffer(&pbuffer[0], pbuffer.size()), boost::bind(&BBCP::Server::Client::sendPacketWriteHandler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
    }

   return;
}
template void BBCP::Server::Client::sendPacket<BBCP::Protocol::Message>(
    BBCP::Protocol::PacketType, BBCP::Protocol::Message const &packet);