2015-11-25 3 views
2

Я реализовал функцию вариационного шаблона в соответствии с wiki. И повторите его с помощью «перегрузки с« терминальными версиями »функций». Код:Итерация шаблона Variadic и GCC

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

Можно строить и использовать без каких-либо проблем с Qt 5.5 для Windows, более чем 64-битных MSVC2013 набора инструментов. Теперь я пытаюсь построить тот же код на Linux с Qt 5.5 для 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). Вино не задействовано - просто место в папке.

Поддерживаются ли вариационные шаблоны? Нужны ли дополнительные параметры компиляции? Или роблем в коде?

+1

Вы можете реализовать это без «рекурсии»: https://gist.github.com/anonymous/5d766dc156529d0fd49d – Simple

+0

Это не имеет никакого отношения к вариационным шаблонам. Простая задача определения функций. –

+0

@ Простой: или в C++ 17: '(данные << ... << args);'. – Jarod42

ответ

5

сообщение об ошибке говорит:

множественное определение `WriteValue (QDataStream &)»

Чтобы решить эту проблему, вы должны объявить writeValue(), как inline:

inline void writeValue(QDataStream& /*data*/) {} 

Когда вы определяют функцию в файле заголовка, y ou всегда должен отметьте его как inline. Таким образом, он не сломает ODR, если вы include заголовок в нескольких единицах перевода.