提问人:Troskyvs 提问时间:9/3/2022 更新时间:9/3/2022 访问量:206
C++ 定义模板函数时如何使用模板类作为【类型参数】?[复制]
c++ how to use template class as [type parameter] when defining template function? [duplicate]
问:
我正在尝试编写一个模板函数,它可以接受像 std::vector/list 这样的泛型容器来做一些工作,如下所示:
template<typename T, typename Container>
void useContainer(const Container<T>& container) {
}
然后在功能中,我可以:main
vector<int> vi;
useContainer(vi); // compilation error, see below
// or
deque<char> dc;
useContainer(dc);
好吧,它没有编译,clang++ 报告以下错误行。
error: expected ')'
void useContainer(const Container<T>& container) {
note: to match this '('
void useContainer(const Container<T>& container) {
note: candidate template ignored: couldn't infer template argument 'T'
void useContainer(const Container<T>& container) {
^
2 errors generated.
老实说,我不太明白这条错误消息实际上意味着什么,这并没有给我太多关于我出错的地方的提示。
如何解决这个问题,并使我的函数能够接受不同的STL容器作为参数? 还是我们需要指定一些模板的模板(嵌入式模板?这里需要什么技术?
谢谢!
答:
1赞
apple apple
9/3/2022
#1
您可以简单地使用泛型类型。
如果代码是否有效,则无论 IS 还是 ,则它无需指定容器类型即可工作。Container
std::vector
std::deque
template<typename T>
void useContainer(const T& container){
for(auto& v:container) // for example, they both support range-based-for
do_something(v);
}
2赞
user12002570
9/3/2022
#2
执行此操作的正确方法是使用模板模板参数,如下所示:
//use template template parameter
template< template<typename W, typename Alloc = std::allocator<W>>typename Container, typename T>
void useContainer(const Container<T>& container) {
}
int main(){
vector<int> vi;
useContainer(vi); //works now
}
评论
std::vector
。事实并非如此template<typename T> std::vector