C++ 定义模板函数时如何使用模板类作为【类型参数】?[复制]

c++ how to use template class as [type parameter] when defining template function? [duplicate]

提问人:Troskyvs 提问时间:9/3/2022 更新时间:9/3/2022 访问量:206

问:

我正在尝试编写一个模板函数,它可以接受像 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容器作为参数? 还是我们需要指定一些模板的模板(嵌入式模板?这里需要什么技术?

谢谢!

C++ 函数 模板 参数 typename

评论

0赞 273K 9/3/2022
查看手册 std::vector。事实并非如此template<typename T> std::vector
1赞 JaMiT 9/3/2022
这回答了你的问题吗?带有模板容器的模板类或者,也许具有特定类型作为泛型参数的 STL 容器如何将模板类的名称传递给模板参数?

答:

1赞 apple apple 9/3/2022 #1

您可以简单地使用泛型类型。

如果代码是否有效,则无论 IS 还是 ,则它无需指定容器类型即可工作。Containerstd::vectorstd::deque

template<typename T>
void useContainer(const T& container){
   for(auto& v:container) // for example, they both support range-based-for
      do_something(v);
}

评论

0赞 user12002570 9/3/2022
这是不正确的,因此不起作用。演示
0赞 apple apple 9/3/2022
@JasonLiam哦,我认为TIL更多的gcc扩展。
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
}

工作演示