C++ &引用;已忽略候选模板:替换失败:";编译器错误?

C++ &引用;已忽略候选模板:替换失败:";编译器错误?,c++,boost,c++11,boost-asio,clang,C++,Boost,C++11,Boost Asio,Clang,我目前正试图用boost::asio编写一些代码,用clang3.1编译 我有一个简单的函数对象: struct tcp_socket_match_condition { template <typename TIter> std::pair<TIter, bool> operator()(TIter begin, TIter end) const { auto result(std::find(begin, end, '\n'))

我目前正试图用boost::asio编写一些代码,用clang3.1编译

我有一个简单的函数对象:

struct tcp_socket_match_condition
{
    template <typename TIter>
    std::pair<TIter, bool> operator()(TIter begin, TIter end) const
    {
        auto result(std::find(begin, end, '\n'));
        const bool found(result != end);
        return std::make_pair(found ? ++result : end, found);
    }
}; 
生成的编译器错误指出它找不到正确的函数重载。你知道为什么这样不行吗

我已经提供了完整的类和编译器错误

In file included from src/network/admin_socket.cpp:1:
In file included from include/bytes42/arthur/network/admin_socket.hpp:4:
include/bytes42/arthur/network/tcp_socket.hpp:95:21: error: no matching function for call to 'read_until'
                    boost::asio::read_until(socket, stream, match_condition_, error);
                    ^~~~~~~~~~~~~~~~~~~~~~~
src/network/admin_socket.cpp:81:10: note: in instantiation of member function
      'bytes42::arthur::network::tcp_socket<bytes42::arthur::network::detail::tcp_socket_match_condition>::listen' requested here
        socket_.listen();
                ^
/usr/local/include/boost/asio/impl/read_until.hpp:47:13: note: candidate function [with SyncReadStream =
      boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, Allocator =
      std::__1::allocator<char>] not viable: no known conversion from 'bytes42::arthur::network::detail::tcp_socket_match_condition' to 'char' for 3rd
      argument;
std::size_t read_until(SyncReadStream& s,
            ^
/usr/local/include/boost/asio/impl/read_until.hpp:138:13: note: candidate function [with SyncReadStream =
      boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, Allocator =
      std::__1::allocator<char>] not viable: no known conversion from 'bytes42::arthur::network::detail::tcp_socket_match_condition' to
      'const std::string' (aka 'const basic_string<char, char_traits<char>, allocator<char> >') for 3rd argument;
std::size_t read_until(SyncReadStream& s,
            ^
/usr/local/include/boost/asio/impl/read_until.hpp:203:13: note: candidate function [with SyncReadStream =
      boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, Allocator =
      std::__1::allocator<char>] not viable: no known conversion from 'bytes42::arthur::network::detail::tcp_socket_match_condition' to
      'const boost::regex' (aka 'const basic_regex<char, regex_traits<char> >') for 3rd argument;
std::size_t read_until(SyncReadStream& s,
            ^
/usr/local/include/boost/asio/impl/read_until.hpp:260:13: note: candidate template ignored: substitution failure [with SyncReadStream =
      boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, Allocator =
      std::__1::allocator<char>, MatchCondition = bytes42::arthur::network::detail::tcp_socket_match_condition]
std::size_t read_until(SyncReadStream& s,
            ^
/usr/local/include/boost/asio/impl/read_until.hpp:312:20: note: candidate template ignored: substitution failure [with SyncReadStream =
      boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, Allocator =
      std::__1::allocator<char>, MatchCondition = bytes42::arthur::network::detail::tcp_socket_match_condition]
inline std::size_t read_until(SyncReadStream& s,
                   ^
/usr/local/include/boost/asio/impl/read_until.hpp:37:20: note: candidate function template not viable: requires 3 arguments, but 4 were provided
inline std::size_t read_until(SyncReadStream& s,
                   ^
/usr/local/include/boost/asio/impl/read_until.hpp:93:20: note: candidate function template not viable: requires 3 arguments, but 4 were provided
inline std::size_t read_until(SyncReadStream& s,
                   ^
/usr/local/include/boost/asio/impl/read_until.hpp:193:20: note: candidate function template not viable: requires 3 arguments, but 4 were provided
inline std::size_t read_until(SyncReadStream& s,
                   ^
1 error generated.
make: *** [build/src/network/admin_socket.o] Error 1
在src/network/admin_socket.cpp中包含的文件中:1:
包含在include/bytes42/arthur/network/admin_socket.hpp中的文件中:4:
include/bytes42/arthur/network/tcp_socket.hpp:95:21:错误:调用“read_until”没有匹配的函数
boost::asio::读取直到(套接字、流、匹配条件、错误);
^~~~~~~~~~~~~~~~~~~~~~~
src/network/admin_socket.cpp:81:10:注意:在成员函数的实例化中
此处请求了'bytes42::arthur::network::tcp_socket::listen'
socket_.listen();
^
/usr/local/include/boost/asio/impl/read_until.hpp:47:13:注意:候选函数[与SyncReadStream一起]=
boost::asio::基本流\u套接字,分配器=
std::_1::分配器]不可行:没有已知的从'bytes42::arthur::network::detail::tcp_socket_match_condition'到'char'的转换,用于第三个
论点
标准::直到(SyncReadStream&s、,
^
/usr/local/include/boost/asio/impl/read_until.hpp:138:13:注意:候选函数[与SyncReadStream一起]=
boost::asio::基本流\u套接字,分配器=
std::_1::分配器]不可行:没有已知的从“bytes42::arthur::network::detail::tcp_套接字匹配条件”到
第三个参数为'const std::string'(也称为'const basic_string');
标准::直到(SyncReadStream&s、,
^
/usr/local/include/boost/asio/impl/read_until.hpp:203:13:注意:候选函数[与SyncReadStream一起使用]=
boost::asio::基本流\u套接字,分配器=
std::_1::分配器]不可行:没有已知的从“bytes42::arthur::network::detail::tcp_套接字匹配条件”到
第三个参数为'const boost::regex'(也称为'const basic_regex');
标准::直到(SyncReadStream&s、,
^
/usr/local/include/boost/asio/impl/read_until.hpp:260:13:注意:忽略候选模板:替换失败[使用SyncReadStream=
boost::asio::基本流\u套接字,分配器=
std::_1::分配器,匹配条件=字节42::arthur::网络::详细信息::tcp\u套接字\u匹配条件]
标准::直到(SyncReadStream&s、,
^
/usr/local/include/boost/asio/impl/read_until.hpp:312:20:注意:忽略候选模板:替换失败[使用SyncReadStream=
boost::asio::基本流\u套接字,分配器=
std::_1::分配器,匹配条件=字节42::arthur::网络::详细信息::tcp\u套接字\u匹配条件]
内联标准::在(SyncReadStream&s、,
^
/usr/local/include/boost/asio/impl/read_until.hpp:37:20:注意:候选函数模板不可行:需要3个参数,但提供了4个
内联标准::在(SyncReadStream&s、,
^
/usr/local/include/boost/asio/impl/read_until.hpp:93:20:注意:候选函数模板不可行:需要3个参数,但提供了4个参数
内联标准::在(SyncReadStream&s、,
^
/usr/local/include/boost/asio/impl/read_until.hpp:193:20:注意:候选函数模板不可行:需要3个参数,但提供了4个参数
内联标准::在(SyncReadStream&s、,
^
生成1个错误。
make:**[build/src/network/admin_socket.o]错误1
类别:

    template <typename TMatchCondition>
    class tcp_socket
    {
        public:
            typedef std::function<std::string(const std::string&)> data_callback;

        public:
            tcp_socket(
                const unsigned short port,
                TMatchCondition match_condition,
                data_callback callback);

            void listen();
            void stop();

        private:
            tcp_socket(const tcp_socket&)   = delete;
            tcp_socket(tcp_socket&&)        = delete;

            tcp_socket& operator=(const tcp_socket&) = delete;
            tcp_socket& operator=(tcp_socket&&)      = delete;

        private:
            const utils::entry_exit         entry_exit_;
            boost::asio::io_service         service_;
            boost::asio::ip::tcp::acceptor  acceptor_;
            TMatchCondition                 match_condition_;
            data_callback                   callback_;
    };


    template <typename TMatchCondition>
    tcp_socket<TMatchCondition>::tcp_socket(
        const unsigned short port,
        TMatchCondition match_condition,
        data_callback callback)
        : entry_exit_("tcp_socket:" + std::to_string(port))
        , acceptor_(service_, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port))
        , match_condition_(match_condition)
        , callback_(callback) {}

    template <typename TMatchCondition>
    void tcp_socket<TMatchCondition>::listen()
    {
        const auto port(acceptor_.local_endpoint().port());
        const std::string port_str(std::to_string(port));

        while(acceptor_.is_open())
        {
            boost::system::error_code error;

            utils::entry_exit ee("Listening on port " + port_str);

            boost::asio::ip::tcp::socket socket(service_);
            acceptor_.accept(socket, error);

            if(error)
            {
                if(error != boost::asio::error::bad_descriptor)
                {
                    LOG(ERROR)
                        << "An error occured while trying to accept a client connection; error="
                        << error.message();

                    sleep(1);  // don't want to flood logs
                }
            }
            else
            {
                while(socket.is_open())
                {
                    boost::asio::streambuf stream;
                    boost::asio::read_until(socket, stream, match_condition_, error);

                    const std::string msg(
                        (std::istreambuf_iterator<char>(&stream)),
                        std::istreambuf_iterator<char>());

                    LOG(INFO) << "Received message: " << msg;

                    boost::asio::write(
                        socket,
                        boost::asio::buffer(callback_(msg)),
                        error);

                    if(error)
                    {
                        if(error != boost::asio::error::broken_pipe)
                        {
                            LOG(ERROR)
                                << "Error whilst writing response, closing client connection: "
                                << error.message();
                        }

                        socket.close();

                        sleep(1);  // don't want to flood logs
                    }
                }
            }
        }
    }


    template <typename TMatchCondition>
    void tcp_socket<TMatchCondition>::stop()
    {
        boost::system::error_code error;
        acceptor_.close(error);

        if(error)
        {
            LOG(ERROR) << "Error whilst stopping TCP socket; error=" << error.message();
        }
    }                                
模板
类tcp_套接字
{
公众:
typedef std::函数数据_回调;
公众:
tcp_套接字(
常量无符号短端口,
tMatch条件匹配\u条件,
数据(U回调);
虚心倾听();
无效停止();
私人:
tcp_套接字(常量tcp_套接字&)=删除;
tcp_套接字(tcp_套接字&&)=删除;
tcp_套接字&运算符=(常量tcp_套接字&)=删除;
tcp_套接字&运算符=(tcp_套接字&&)=删除;
私人:
const utils::entry\u exit entry\u exit;
boost::asio::io\u服务\uu;
boost::asio::ip::tcp::acceptor-acceptor;
TMatchCondition匹配条件;
数据回调;
};
模板
tcp_套接字::tcp_套接字(
常量无符号短端口,
tMatch条件匹配\u条件,
数据(U回调)
:入口\出口\(“tcp\ U套接字:+std::to\ U字符串(端口))
,接受者(服务,boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(),端口))
,匹配条件(匹配条件)
,回调{(回调){}
模板
无效tcp_套接字::侦听()
{
常量自动端口(接受器\本地\端点().端口());
const std::string port_str(std::to_string(port));
while(接受器打开()
{
boost::system::error\u code error;
utils::进入/退出ee(“监听端口”+端口str);
boost::asio::ip::tcp::socket套接字(服务);
acceptor.accept(套接字,错误);
如果(错误)
{
if(error!=boost::asio::error::bad_描述符)
{
日志(错误)

我不认为您发布了完整的代码,但问题似乎在于匹配条件:您是否指定使用您的
tcp\u socket\u match\u条件是一个匹配条件?

好;因此clang在这里(有点)有帮助

它告诉你在
之前有八种专门的阅读方法,但它们都无法发挥作用

前三个参数使用char、char和std::string作为第三个参数。这不起作用

最后三个有
    template <typename TMatchCondition>
    class tcp_socket
    {
        public:
            typedef std::function<std::string(const std::string&)> data_callback;

        public:
            tcp_socket(
                const unsigned short port,
                TMatchCondition match_condition,
                data_callback callback);

            void listen();
            void stop();

        private:
            tcp_socket(const tcp_socket&)   = delete;
            tcp_socket(tcp_socket&&)        = delete;

            tcp_socket& operator=(const tcp_socket&) = delete;
            tcp_socket& operator=(tcp_socket&&)      = delete;

        private:
            const utils::entry_exit         entry_exit_;
            boost::asio::io_service         service_;
            boost::asio::ip::tcp::acceptor  acceptor_;
            TMatchCondition                 match_condition_;
            data_callback                   callback_;
    };


    template <typename TMatchCondition>
    tcp_socket<TMatchCondition>::tcp_socket(
        const unsigned short port,
        TMatchCondition match_condition,
        data_callback callback)
        : entry_exit_("tcp_socket:" + std::to_string(port))
        , acceptor_(service_, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port))
        , match_condition_(match_condition)
        , callback_(callback) {}

    template <typename TMatchCondition>
    void tcp_socket<TMatchCondition>::listen()
    {
        const auto port(acceptor_.local_endpoint().port());
        const std::string port_str(std::to_string(port));

        while(acceptor_.is_open())
        {
            boost::system::error_code error;

            utils::entry_exit ee("Listening on port " + port_str);

            boost::asio::ip::tcp::socket socket(service_);
            acceptor_.accept(socket, error);

            if(error)
            {
                if(error != boost::asio::error::bad_descriptor)
                {
                    LOG(ERROR)
                        << "An error occured while trying to accept a client connection; error="
                        << error.message();

                    sleep(1);  // don't want to flood logs
                }
            }
            else
            {
                while(socket.is_open())
                {
                    boost::asio::streambuf stream;
                    boost::asio::read_until(socket, stream, match_condition_, error);

                    const std::string msg(
                        (std::istreambuf_iterator<char>(&stream)),
                        std::istreambuf_iterator<char>());

                    LOG(INFO) << "Received message: " << msg;

                    boost::asio::write(
                        socket,
                        boost::asio::buffer(callback_(msg)),
                        error);

                    if(error)
                    {
                        if(error != boost::asio::error::broken_pipe)
                        {
                            LOG(ERROR)
                                << "Error whilst writing response, closing client connection: "
                                << error.message();
                        }

                        socket.close();

                        sleep(1);  // don't want to flood logs
                    }
                }
            }
        }
    }


    template <typename TMatchCondition>
    void tcp_socket<TMatchCondition>::stop()
    {
        boost::system::error_code error;
        acceptor_.close(error);

        if(error)
        {
            LOG(ERROR) << "Error whilst stopping TCP socket; error=" << error.message();
        }
    }