使用c++ STL容器定义模板时出现问题



我试图创建一个与模板一起工作的函数,该模板应该适应具有vector类的容器本身作为默认值。例如T<int>。然而,当我试图在main中使用此函数时,我得到了没有匹配函数的错误。

#include<string>
#include<iostream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<forward_list>
using namespace std;
template<template <typename> class Container = vector>
Container<string> filter_codes(const string& route, const char& init) {
Container<string> _return;
vector<string> temp;
ifstream file(route);
string wd;
while(file>>wd){
if(wd[0]==init)
temp.push_back(wd);
}
_return.resize(temp.size());
copy(temp.begin(), temp.end(), begin(_return));
file.close();
return _return;
}
int main(){
vector<string> code = filter_codes("a.txt", 'c');
for(auto i : code) cout<<i<<' ';
return 0;
}

错误是

main.cpp:36:24: error: no matching function for call to 'filter_codes'
vector<string> code = filter_codes("a.txt", 'c');
^~~~~~~~~~~~
main.cpp:14:19: note: candidate template ignored: substitution failure :
template template argument has different template parameters than its
corresponding template template parameter
Container<string> filter_codes(const string& route, const char& init)

我打算通过下面的语句来使用这个函数。

vector<string> t1 = filter_codes("a.txt", 'x');
auto t2 = filter_codes<list>("a.txt", 'x');

您的代码是有效的,并且由GCC和MSVC编译。然而,Clang错误意味着您使用的模板类型需要与模板模板参数*精确匹配。因为std::vector有2个模板参数,而你写的模板模板参数只有1个,它不是一个精确匹配,它失败了,即使它至少是专门化的,并且是有效的。

*完全规则有一个例外,当模板形参列表是可变包时,它允许匹配。您可以使用此异常使代码在Clang上工作。只需更改您的模板模板参数,以便在可变数量的模板参数上进行模板化

template<template <typename ...> class Container = vector>
//  ^^^
Container<string> filter_codes(const string& route, const char& init) {
// ...
}

这在任何地方都有效。

最新更新