Когда я пытаюсь специализировать переменную шаблона для универсального контейнера (например, std::list<...>
, а не для конкретного, например std::list<double>
) Я получаю ошибку связи с gcc 5.3
(но не с clang 3.5
)Специализация переменной шаблона (для шаблона шаблона)
/tmp/ccvxFv3R.s: Assembler messages:
/tmp/ccvxFv3R.s:206: Error: symbol `_ZL9separator' is already defined
http://coliru.stacked-crooked.com/a/38f68c782d385bac
#include<string>
#include<iostream>
#include<list>
#include<forward_list>
#include<vector>
template<typename T> std::string const separator = ", ";
template<typename... Ts> std::string const separator<std::list<Ts...> > = "<->";
template<typename... Ts> std::string const separator<std::forward_list<Ts...>> = "->";
int main(){
std::cout << separator<std::vector<double>> << '\n';
std::cout << separator<std::list<double>> << '\n';
std::cout << separator<std::forward_list<double>> << '\n';
}
(Это хорошо компилируется clang 3.5
и работает, как ожидалось. также VARIADIC шаблон не то, что вызывает проблемы, я т с невариантным шаблоном).
Если это не ошибка в gcc
, как вы думаете, есть ли работа вокруг? Я пытался использовать класс специализации, но это не возможно, либо:
template<class T>
struct separator{
static std::string const value;
};
template<class T>
std::string const separator<T>::value = ", ";
template<typename... Ts>
std::string const separator<std::list<Ts...>>::value = "<->";
template<typename... Ts>
std::string const sep<std::forward_list<Ts...>>::value = "->";
Я думаю, что обработка GCC с частичными специализациями шаблона шаблона просто сломана. Шаблоны классов более зрелые, но вы должны частично специализировать все это, что раздражает. –
@ T.C. Да, я закончил это, очень раздражающе. Благодарю. – alfC
Сообщается как https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69515 –