tru*_*ruf 2 c++ qt gcc variadic-templates
我已经根据wiki实现了一个可变参数模板函数.并借助于"重载"终止版本的"函数"来迭代它.代码:
void writeValue(QDataStream& /*data*/) {}
template<typename A, typename... Values>
void writeValue(QDataStream& data, const A& arg1, const Values&... args)
{
data << arg1;
writeValue(data, args...);
}
template<typename... Values>
quint32 PrepareMessage(QDataStream& data, func_code fcode, Values... parameters)
{
data << quint32(fcode);
writeValue(data, parameters...);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它可以在没有任何问题的情况下构建和使用,而不是Qt 5.5 for Windows over MSVC2013 64bit工具链.现在,我正在尝试使用Qt 5.5 for Linux在GCC 64位上构建相同的代码,并在编译时遇到以下错误:
g++ -c -pipe -std=c++11 -g -Wall -W -D_REENTRANT -fPIC -D_64bit -DQT_NETWORK_LIB -DQT_CORE_LIB -I../Trans2QuikWrapper -I. -I../../../Qt/5.5/gcc_64/include -I../../../Qt/5.5/gcc_64/include/QtNetwork -I../../../Qt/5.5/gcc_64/include/QtCore -I. -I../../../Qt/5.5/gcc_64/mkspecs/linux-g++ -o moc_T2Q_Client.o moc_T2Q_Client.cpp
g++ -Wl,-rpath,/home/truf/Qt/5.5/gcc_64 -Wl,-rpath,/home/truf/Qt/5.5/gcc_64/lib -o t2q T2Q_Client.o main_client.o moc_T2Q_Client.o -L/home/truf/Qt/5.5/gcc_64/lib -lQt5Network -lQt5Core -lpthread
main_client.o: In function `int QGenericAtomicOps<QBasicAtomicOps<4> >::load<int>(int const&)':
/home/truf/.wine/drive_c/build-t2q-Desktop_Qt_5_5_1_GCC_64bit-Debug/../Trans2QuikWrapper/io_utils.h:16: multiple definition of `writeValue(QDataStream&)'
Makefile:192: recipe for target 't2q' failed
T2Q_Client.o:/home/truf/.wine/drive_c/build-t2q-Desktop_Qt_5_5_1_GCC_64bit-Debug/../Trans2QuikWrapper/io_utils.h:16: first defined here
moc_T2Q_Client.o: In function `int QGenericAtomicOps<QBasicAtomicOps<4> >::load<int>(int const&)':
/home/truf/.wine/drive_c/build-t2q-Desktop_Qt_5_5_1_GCC_64bit-Debug/../Trans2QuikWrapper/io_utils.h:16: multiple definition of `writeValue(QDataStream&)'
T2Q_Client.o:/home/truf/.wine/drive_c/build-t2q-Desktop_Qt_5_5_1_GCC_64bit-Debug/../Trans2QuikWrapper/io_utils.h:16: first defined here
collect2: error: ld returned 1 exit status
make: *** [t2q] Error 1
Run Code Online (Sandbox Code Playgroud)
gcc版本是5.2.1 20151010(Ubuntu 5.2.1-22ubuntu2).不涉及葡萄酒 - 只是文件夹位置.
那里是否支持可变参数模板?是否需要任何其他编译参数?或者roblem在代码中?
错误消息说:
`writeValue(QDataStream&)'的多重定义
要解决此问题,您必须声明writeValue()为inline:
inline void writeValue(QDataStream& /*data*/) {}
Run Code Online (Sandbox Code Playgroud)
当你定义在头文件中的函数,你应该始终将其标记为inline.这样,如果您在多个翻译单元中使用标题,它将不会破坏ODRinclude.