当我试图专注一个模板变量为一个通用的容器(例如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 –