具有多个参数的模板化类专用化,其中一个模板参数是模板本身

Templated class specialization with multiple arguments where one template argument is a template itself

本文关键字:参数 一个 专用      更新时间:2023-10-16

我认为最简单的方法是显示一些代码:

template<typename T>
struct TemplateTest { //<-- generic version
using typeGeneric = int;
};
template<>
struct TemplateTest<std::vector<int>> { //<-- specialized with specialized version of vector
using typeVectorInt = int;
};
template<typename T>
struct TemplateTest<std::vector<T>> { //<-- specialized with generic version of vector
using typeVectorT = int;
};
int main (int argc, char** argv) {
typename TemplateTest<int>::typeGeneric var1;
typename TemplateTest<std::vector<int>>::typeVectorInt var2;
typename TemplateTest<std::vector<char>>::typeVectorT var3;
return 0;
}

这工作正常且符合预期。由于我在不同的专业中使用了不同的使用名称,如果在编译过程中选择了预期的专用,则会出现编译错误。(我这样做只是为了这篇文章来显示问题(

但是,这没有按预期工作:

template<typename Tfirst, typename Tsecond>
struct TemplateTest { //<-- generic version
using typeGeneric = int;
};
template<typename Tfirst>
struct TemplateTest<Tfirst, std::vector<int>> { //<-- specialized with specialized version of vector
using typeVectorInt = int;
};
template<typename Tfirst>
template<typename T>
struct TemplateTest<Tfirst, std::vector<T>> { //<-- specialized with generic version of vector
using typeVectorT = int;
};
int main (int argc, char** argv) {
typename TemplateTest<int, int>::typeGeneric var1;
typename TemplateTest<int, std::vector<int>>::typeVectorInt var2;
typename TemplateTest<int, std::vector<char>>::typeVectorT var3;
return 0;
}

var3 是问题所在。向量专用化不起作用(不是编译器选择的(,我不知道为什么。可以这样做吗,如果可以,如何做到?

谢谢!

您正在用错误的语法声明第二个专用化(使用无关的模板参数列表(;将其更改为

template<typename Tfirst, typename T>
struct TemplateTest<Tfirst, std::vector<T>> { //<-- specialized with generic version of vector
using typeVectorT = int;
};
相关文章: