C++ VS2010上带有模板实现的未解析外部符号
我刚刚构建了一个boost网络的模板实现 下面是调用我的网络类的模板类:C++ VS2010上带有模板实现的未解析外部符号,c++,visual-studio-2010,templates,boost-asio,shared-ptr,C++,Visual Studio 2010,Templates,Boost Asio,Shared Ptr,我刚刚构建了一个boost网络的模板实现 下面是调用我的网络类的模板类: AbstractNetwork.hpp : #include "Network.hpp" template <typename T, typename R, typename S, typename A> class AbstractNetwork { private: T connection; public: AbstractNetwork(A acceptor) {
AbstractNetwork.hpp :
#include "Network.hpp"
template <typename T, typename R, typename S, typename A>
class AbstractNetwork
{
private:
T connection;
public:
AbstractNetwork(A acceptor)
{
connection = T::create(acceptor);
}
void write(const R msg)
{
connection->Swrite(msg);
}
R read(void)
{
connection->Sread();
return (connection->getIdata());
}
S getSocket(void)
{
return (connection->getSocket());
}
void close(void)
{
connection->close();
}
};
我并没有给出所有函数的代码,因为它太长了,而且我确信它可以工作
当我构建此项目时,在VS2010 ultimate下出现以下错误:
error LNK2001: unresolved external symbol "public: void __thiscall AbstractNetwork<class boost::shared_ptr<class Network>,struct Commande *,class boost::asio::basic_stream_socket<class boost::asio::ip::tcp,class boost::asio::stream_socket_service<class boost::asio::ip::tcp> > &,class boost::asio::io_service &>::close(void)"
error LNK2001: unresolved external symbol "public: void __thiscall AbstractNetwork<class boost::shared_ptr<class Network>,struct Commande *,class boost::asio::basic_stream_socket<class boost::asio::ip::tcp,class boost::asio::stream_socket_service<class boost::asio::ip::tcp> > &,class boost::asio::io_service &>::write(struct Commande * const)"
error LNK2001: unresolved external symbol "public: class boost::asio::basic_stream_socket<class boost::asio::ip::tcp,class boost::asio::stream_socket_service<class boost::asio::ip::tcp> > & __thiscall AbstractNetwork<class boost::shared_ptr<class Network>,struct Commande *,class boost::asio::basic_stream_socket<class boost::asio::ip::tcp,class boost::asio::stream_socket_service<classboost::asio::ip::tcp> > &,class boost::asio::io_service &>::getSocket(void)"
error LNK2001: unresolved external symbol "public: __thiscall AbstractNetwork<class boost::shared_ptr<class Network>,struct Commande *,class boost::asio::basic_stream_socket<class boost::asio::ip::tcp,class boost::asio::stream_socket_service<class boost::asio::ip::tcp> > &,class boost::asio::io_service &>::AbstractNetwork<class boost::shared_ptr<class Network>,struct Commande *,classboost::asio::basic_stream_socket<class boost::asio::ip::tcp,class boost::asio::stream_socket_service<class boost::asio::ip::tcp> > &,class boost::asio::io_service &>(class boost::asio::io_service &)
它很长,但我想告诉你所有这些错误,因为我认为问题出在我的模板类型上。所以我想我的问题是AbstractNetwork.hpp,但我找不到这个
你对此有什么想法吗?修改你的课程。您不需要为每个类成员函数重复模板,它们已经是模板类的一部分了
template <typename T, typename R, typename S, typename A>
class AbstractNetwork
{
private:
T connection;
public:
AbstractNetwork(A acceptor)
{
this->connection = T::create(acceptor);
}
void write(const R msg)
{
this->connection->Swrite(msg);
}
read(void)
{
this->connection->Sread();
return (this->connection->getIdata());
}
getSocket(void)
{
return (this->connection->getSocket());
}
close(void)
{
this->close(); // <<--- is this a mistake?
//Probably you wanted this->connection->close();
}
};
除了近处明显的输入错误外,您也不需要在任何地方都使用它,因为它是多余的,使代码看起来更混乱。您是否编写了包含这些方法实现的Network.cpp源代码文件?你把它添加到你的项目中了吗?链接器错误说你没有。是的,是的,我的项目中有一个Network.cpp,我没有给出这个,因为它太长了,我确信他在我的项目中,因为我在添加我的抽象网络之前编写并测试了这个。是的,是的,这是一个错误,对不起。我正在进行这些更正。现在出现以下错误:错误C2039:“创建”:不是“boost::shared_ptr”的成员,错误C3861:“创建”:标识符未找到您正在以T的形式传递一个类,该类未实现您期望的静态T::create接口。解决这个问题。我很高兴您原来的问题已经解决了。您的意思是将connection=static T::createacceptor@Yumino-你应该打开一个新问题,并在那里发布相关代码,这样你就可以得到一个合理可靠的答案。我要说的是,作为T传递的类没有名为create的静态成员。我不知道它是哪个类,它有什么,所以我不知道你应该如何修复它。这与我在这里回答的问题完全无关。
template <typename T, typename R, typename S, typename A>
class AbstractNetwork
{
private:
T connection;
public:
AbstractNetwork(A acceptor)
{
this->connection = T::create(acceptor);
}
void write(const R msg)
{
this->connection->Swrite(msg);
}
read(void)
{
this->connection->Sread();
return (this->connection->getIdata());
}
getSocket(void)
{
return (this->connection->getSocket());
}
close(void)
{
this->close(); // <<--- is this a mistake?
//Probably you wanted this->connection->close();
}
};