Joã*_*ulo 7 c++ templates template-specialization
我有这种情况:
#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>>();
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试专门针对的模板std::vector<T>,但出现此错误:
error: too many template-parameter-lists
std::vector<T> f<std::vector<T>>() {
Run Code Online (Sandbox Code Playgroud)
我该如何专攻std::vector<T>?
Qui*_*mby 10
没有所谓的部分专用功能模板。您正在做的是创建一个新模板,因此正确的语法应为:
template<typename T>
std::vector<T> f() {
return { T() };
}
Run Code Online (Sandbox Code Playgroud)
这会使函数名称超载,f并且两个模板是独立的。但是通过拥有这两个重载,几乎所有的调用都会变得f模棱两可,包括您的例子main()。
编辑:
如果您也删除了template<>对类部分专业化无效的行,则clang会生成更多有用的错误消息:
错误:
f<std::vector<T,std::allocator<_Tp1> > >不允许非类,非变量的部分专业化Run Code Online (Sandbox Code Playgroud)std::vector<T> f<std::vector<T>>() {
如果问题是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(); }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |