Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可变模板迭代与GCC_C++_Qt_Gcc_Variadic Templates - Fatal编程技术网

C++ 可变模板迭代与GCC

C++ 可变模板迭代与GCC,c++,qt,gcc,variadic-templates,C++,Qt,Gcc,Variadic Templates,我已经根据实现了一个可变模板函数。并借助函数终止版本的重载来迭代它。守则: void writeValue(QDataStream& /*data*/) {} template<typename A, typename... Values> void writeValue(QDataStream& data, const A& arg1, const Values&... args) { data << arg1; wri

我已经根据实现了一个可变模板函数。并借助函数终止版本的重载来迭代它。守则:

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;
}
它可以在MSVC2013 64位工具链上使用Qt 5.5 for Windows构建和使用,不会出现任何问题。 现在,我尝试在Linux上使用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
gcc版本是5.2.1 20151010 Ubuntu 5.2.1-22ubuntu2。不涉及Wine-只是一个文件夹位置


是否支持可变模板?需要额外的编译参数吗?或者问题在代码中?

错误消息显示:

“writeValueQDataStream&”的多个定义

要解决此问题,必须将writeValue声明为内联:


在头文件中定义函数时,始终应将其标记为内联。这样,如果将标题包含在多个翻译单元中,它就不会破坏规则。

您可以在不使用递归的情况下实现这一点:这与可变模板无关。在哪里定义函数是一个简单的问题。@simple:或在C++17:data中
inline void writeValue(QDataStream& /*data*/) {}