неразрешенный внешний символ с реализацией шаблона на VS2010 - PullRequest
0 голосов
/ 30 ноября 2011

Я только что построил шаблонную реализацию моей сети поддержки.

вот мой шаблонный класс, который вызывает мой сетевой класс:

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();
}
};

, и это мой сетевой класс, который работаетс boost::tcp::socket:

Network.hpp

class       Network : public boost::enable_shared_from_this<Network>
{
private:
    tcp::socket                     socket;
    std::vector<char>               Idata;
    char                            Iheader[MYINT];
    bool                            readHeader;
    void                            endRead(const error_code& error, size_t nbytes);
    void                            endWrite(const error_code &error);
    size_t                          Isize;

public:
    typedef boost::shared_ptr<Network> ptr;

    Network(io_service &);
    ~Network();
    void                close(void);
    void                Sread(void);
    void                Swrite(Commande *);
    tcp::socket&        getSocket(void);
    Commande*           getIdata(void);
    std::string         convertHeader(void);
    static ptr          create(io_service &);
};

я не даю весь код функции, потому что он слишком длинный, и я уверен, что он работает.

Когда я строю этот проект, у меня есть этоследующая ошибка в 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, но я не могу найти это.

Вы знали об этом?

1 Ответ

0 голосов
/ 30 ноября 2011

Исправь свой класс.Вам не нужно повторять шаблон для каждой функции-члена класса, они уже являются частью класса шаблона.

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();
}

};

Помимо очевидной опечатки в close, вам также не нужноиспользовать this везде, это избыточно и делает код более грязным.

...