【发布时间】:2016-01-27 02:38:12
【问题描述】:
当我尝试为通用容器(例如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 一起编译并按预期工作。可变参数模板也不是导致问题的原因,我尝试使用非可变参数模板)。
如果这不是 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.是的,我最终这样做了,非常烦人。谢谢。
标签: c++ gcc c++14 template-specialization variable-templates