我有这种情况:
#include <vector>
template<typename T>
T f() { return T(); }
template<>
template<typename T>
std::vector<T> f<std::vector<T>>() {
return { T() };
}
int main(){
f<std::vector<int>>();
}
我正在尝试专门设计std::vector<T>
的模板,但出现此错误:
error: too many template-parameter-lists
std::vector<T> f<std::vector<T>>() {
如何专门研究std::vector<T>
?
答案 0 :(得分:10)
不存在部分专用的功能模板。您正在做的是创建一个新模板,因此正确的语法应为:
template<typename T>
std::vector<T> f() {
return { T() };
}
这会使函数名称f
重载,并且两个模板是独立的。但是,通过同时具有这两种重载,几乎所有对f
的调用都将变得模棱两可,包括main()
中的一个示例。
编辑:
如果您删除了template<>
行,这对于类部分专业化也是无效的,那么clang会生成更多有用的错误消息:
错误:不允许使用非类,不变的部分专业化
f<std::vector<T,std::allocator<_Tp1> > >
std::vector<T> f<std::vector<T>>() {
答案 1 :(得分:6)
如果问题是X,解决方案是Y,则通常功能模板的专业化是Z。这时无论如何都可以进行专业化。您不能部分专门化功能模板,而只能重载它们。
这里的解决方案是使用帮助器。您可以 专门设计的类模板可以完成工作。同时,功能模板仅转发给它。
namespace detail {
template<typename T>
struct f {
static T work() { return T(); }
};
template<typename T>
struct f<std::vector<T>> {
static std::vector<T> work() { return {T()}; }
};
}
template<typename T>
T f() { return detail::f<T>::work(); }