如何在另一个模板函数中调用模板函数?

我试图用C++14写一个通用的打印函数。但是模板 printItem 函数无法实例化。

template <class T>
void printItem(T t)
{
    std::cout << t << std::endl;
}

template <class T>
void printVector(T t)
{
    for_each(t.begin(), t.end(), printItem);
}

int main()
{
    std::vector<std::string> vs = {"word1", "word2"};

    printVector(vs);
}

这段代码导致编译器错误。

no matching function for call to 
'for_each(std::vector<std::__cxx11::basic_string<char> >::iterator, std::vector<std::__cxx11::basic_string<char> >::iterator, <unresolved overloaded function type>)'

解决方案:

printItem 是一个函数模板,它不能推断出参数类型,所以你需要指定,比如这样。

for_each(t.begin(), t.end(), printItem<typename T::value_type>);

另外,似乎有一个错别字在 printItem. 你不需要取消引用。t 完全不使用。

如果你没有在其他地方使用这个函数,那么你可以使用一个lambda来内联定义它,就像这样。

for_each(t.begin(), t.end(), [](auto s) { std::cout << s << std::endl; });

注意这个lambda operator() 在这种情况下也是模板化的,不过类型可以推导出来,所以就可以了。

另外。std::for_each 在我看来,这往往是一种代码的味道。可以用可读性更强的来代替。

for (auto const &s : t)
    std::cout << s << std::endl; 

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何去除导航条上方的空白处?[重复]

2022-9-8 9:10:25

未分类

在类中添加事件监听器到元素时出错。

2022-9-8 9:21:29

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索