gpt4 book ai didi

c++模板到模板参数

转载 作者:行者123 更新时间:2023-11-30 01:19:28 25 4
gpt4 key购买 nike

最近我在测试一些 C++ 模板代码时发现了一个令人难以置信的错误。根据我在互联网上的研究,特别是 stackoverflow,这段代码是完全有效的,但是编译器会引发编译时错误。错误位于代码下方。

代码:

template<template<class> class C, typename T> void print(C<T>& c) {
}

int test() {
vector<string> v(5, "Yow!");
print(v);
return 0;
}

编译器输出:

In function ‘int test()’:
error: no matching function for call to ‘print2(std::vector<std::basic_string<char> >&)’
note: candidate is:
note: template<template<class> class C, class T> void print2(C<T>&)

似乎定义或我的编译器有问题,但我用 g++ 和 clang++ 测试了这段代码,以确保没有任何依赖于编译器的问题。他们都引发了同样的错误。

我非常感谢任何旨在澄清这个问题的有意义的评论。

谢谢

最佳答案

std::vector,作为 C 传入的类型,具有多个模板参数。它有通常的元素类型,还有一个分配器。在保留类型参数列表的同时解决这个问题的最简单方法是使用可变参数模板:

template<template<class...> class C, typename... Ts> void print(C<Ts...>& c)
^^^^^^^^ ^^^^^^ ^^^^^^^^

实际上,在大多数情况下,通过明确指定它们,使用单个类型参数更容易,就像 Cheers 的回答一样。如果您不关心类型参数,请随意不跟踪它们。对于容器,您甚至可以仅从容器类型中获取它们:

template<typename Container> void print(Container& c) {
typename Container::value_type t;
}

关于c++模板到模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20852733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com