我有一個舊程式,我想用 GCC 8.3.1 在 Centos 8 上編譯。make 命令如下所示:
CXXFLAGS = -O2 -std=c 11
all: my_prog
my_prog: my_prog.o
g my_prog.o -o my_prog -lboost_filesystem -lboost_system -lsecond_level_include -lthird_level_include -lboost_regex -lboost_program_options `mysql_config --libs`
這是輸出make:
In file included from /usr/local/include/redisclient/redissyncclient.h:16,
from /usr/local/include/third_level_include.hpp:11,
from /usr/local/include/second_level_include.hpp:40,
from my_prog.cpp:9:
/usr/local/include/redisclient/impl/redisclientimpl.h:72:5: error: invalid use of template-name ‘boost::asio::strand’ without an argument list
boost::asio::strand strand;
^~~~~
/usr/local/include/redisclient/impl/redisclientimpl.h:72:5: note: class template argument deduction is only available with -std=c 17 or -std=gnu 17
In file included from /usr/local/include/redisclient/impl/redisclientimpl.h:13,
from /usr/local/include/redisclient/redissyncclient.h:16,
from /usr/local/include/third_level_include.hpp:11,
from /usr/local/include/second_level_include.hpp:40,
from my_prog.cpp:9:
/usr/include/boost/asio/strand.hpp:29:7: note: ‘template<class Executor> class boost::asio::strand’ declared here
class strand
^~~~~~
[剪切大量輸出]
所以我做了它的建議并替換-std=c 11為-std=gnu 17,現在我得到了這個:
g -O2 -std=gnu 17 -c -o my_prog.o my_prog.cpp
In file included from /usr/local/include/redisclient/redissyncclient.h:16,
from /usr/local/include/third_level_include.hpp:11,
from /usr/local/include/second_level_include.hpp:40,
from my_prog.cpp:9:
/usr/local/include/redisclient/impl/redisclientimpl.h:72:5: error: invalid use of template-name ‘boost::asio::strand’ without an argument list
boost::asio::strand strand;
^~~~~
make: *** [<builtin>: my_prog.o] Error 1
考慮到我不會從 Redis 更改第三方庫代碼,是否有編譯器標志或可以用來消除此錯誤的東西?代碼曾在 Centos 6 上用 GCC 4.4.7 編譯過。
編輯:這是錯誤來源的檔案
/*
* Copyright (C) Alex Nekipelov ([email protected])
* License: MIT
*/
#ifndef REDISCLIENT_REDISCLIENTIMPL_H
#define REDISCLIENT_REDISCLIENTIMPL_H
#include <boost/array.hpp>
#include <boost/function.hpp>
#include <boost/noncopyable.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/strand.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include "../redisparser.h"
#include "../redisbuffer.h"
#include "../config.h"
class RedisClientImpl : public boost::enable_shared_from_this<RedisClientImpl> {
public:
enum State {
NotConnected,
Connected,
Subscribed,
Closed
};
REDIS_CLIENT_DECL RedisClientImpl(boost::asio::io_service &ioService);
REDIS_CLIENT_DECL ~RedisClientImpl();
REDIS_CLIENT_DECL void handleAsyncConnect(
const boost::system::error_code &ec,
const boost::function<void(bool, const std::string &)> &handler);
REDIS_CLIENT_DECL void close();
REDIS_CLIENT_DECL State getState() const;
REDIS_CLIENT_DECL static std::vector<char> makeCommand(const std::vector<RedisBuffer> &items);
REDIS_CLIENT_DECL RedisValue doSyncCommand(const std::vector<RedisBuffer> &buff);
REDIS_CLIENT_DECL void doAsyncCommand(
const std::vector<char> &buff,
const boost::function<void(const RedisValue &)> &handler);
REDIS_CLIENT_DECL void sendNextCommand();
REDIS_CLIENT_DECL void processMessage();
REDIS_CLIENT_DECL void doProcessMessage(const RedisValue &v);
REDIS_CLIENT_DECL void asyncWrite(const boost::system::error_code &ec, const size_t);
REDIS_CLIENT_DECL void asyncRead(const boost::system::error_code &ec, const size_t);
REDIS_CLIENT_DECL void onRedisError(const RedisValue &);
REDIS_CLIENT_DECL static void defaulErrorHandler(const std::string &s);
REDIS_CLIENT_DECL static void append(std::vector<char> &vec, const RedisBuffer &buf);
REDIS_CLIENT_DECL static void append(std::vector<char> &vec, const std::string &s);
REDIS_CLIENT_DECL static void append(std::vector<char> &vec, const char *s);
REDIS_CLIENT_DECL static void append(std::vector<char> &vec, char c);
template<size_t size>
static inline void append(std::vector<char> &vec, const char (&s)[size]);
template<typename Handler>
inline void post(const Handler &handler);
boost::asio::strand strand; // Here it is!
boost::asio::ip::tcp::socket socket;
RedisParser redisParser;
boost::array<char, 4096> buf;
size_t subscribeSeq;
typedef std::pair<size_t, boost::function<void(const std::vector<char> &buf)> > MsgHandlerType;
typedef boost::function<void(const std::vector<char> &buf)> SingleShotHandlerType;
typedef std::multimap<std::string, MsgHandlerType> MsgHandlersMap;
typedef std::multimap<std::string, SingleShotHandlerType> SingleShotHandlersMap;
std::queue<boost::function<void(const RedisValue &v)> > handlers;
MsgHandlersMap msgHandlers;
SingleShotHandlersMap singleShotMsgHandlers;
struct QueueItem {
boost::function<void(const RedisValue &)> handler;
boost::shared_ptr<std::vector<char> > buff;
};
std::queue<QueueItem> queue;
boost::function<void(const std::string &)> errorHandler;
State state;
};
template<size_t size>
void RedisClientImpl::append(std::vector<char> &vec, const char (&s)[size])
{
vec.insert(vec.end(), s, s size);
}
template<typename Handler>
inline void RedisClientImpl::post(const Handler &handler)
{
strand.post(handler);
}
#ifdef REDIS_CLIENT_HEADER_ONLY
#include "redisclientimpl.cpp"
#endif
#endif // REDISCLIENT_REDISCLIENTIMPL_H
uj5u.com熱心網友回復:
更新
您正在使用該庫的舊版本。使用 v0.6.1 或更高版本:https : //github.com/nekipelov/redisclient/pull/53
不久前,所有執行器介面都已升級(很久)。
Strands 曾經是嵌套的 typedef(io_service如果啟用它,仍然有一個用于“遺留”兼容性)。
然而,新的型別是boost::asio::strand<Executor>(例如boost::asio::io_context::executor_type)。您可以輕松地為任何執行程式創建一個鏈,例如:
auto s = make_strand(io_object.get_executor());
您所看到的是這些名稱的明顯混淆。我懷疑這可能與
- 別名的本地 typedef
strand - 命名的區域變數
strand(雖然我沒有立即看到這將如何導致確切的訊息被轉發) - 最有可能的:你有一個
using namespace可以拉入新strand模板的
有了這些資訊,你應該能夠把它整理出來。
當然,如果您發布了代碼,我們可以為您展示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368071.html
上一篇:模板引數與函式引數
