gpt4 book ai didi

C++ 模板的模板编译失败

转载 作者:太空狗 更新时间:2023-10-29 20:08:34 24 4
gpt4 key购买 nike

我有这个测试程序

#include<iostream>
#include<vector>
using namespace std;

template<template<class> class C, typename T>
void print(const C<T>& c){
for(auto& e : c)cout<<e<<endl;
}
int main(){
vector<int> v;
print(v);
return 0;
}

编译失败:

g++ m.cpp -std=c++11
m.cpp: In function ‘int main()’:
m.cpp:11:16: error: no matching function for call to ‘print(std::vector<int>&)’
print(v);
^
m.cpp:6:6: note: candidate: template<template<class> class C, class T> void print(const C<T>&)
void print(const C<T>& c){
^~~~~
m.cpp:6:6: note: template argument deduction/substitution failed:
m.cpp:11:16: note: template parameters of a template template argument are inconsistent with other deduced template arguments
print(v);
^

我将 print() 签名从 (const C& c) 更改为 (C& c),它仍然失败:

$ g++ m.cpp -std=c++11
m.cpp: In function ‘int main()’:
m.cpp:11:16: error: no matching function for call to ‘print(std::vector<int>&)’
print(v);
^
m.cpp:6:6: note: candidate: template<template<class> class C, class T> void print(C<T>&)
void print(C<T>& c){
^~~~~
m.cpp:6:6: note: template argument deduction/substitution failed:
m.cpp:11:16: note: template parameters of a template template argument are inconsistent with other deduced template arguments
print(v);
^

如何解决?

最佳答案

您的编译问题出现是因为您的 template template parameter Cstd::vector 的声明不匹配:

template<
class T,
class Allocator = std::allocator<T>
> class vector;

如您所见,std::vector 有两个模板参数,而您的 C 只有一个。但是,还要注意第二个参数 (class Allocator) 有一个默认类型参数。从 C++17 开始,即使按照您编写它的方式,它也是格式良好的,因为添加了 模板模板参数 匹配不需要为具有默认参数(如 Allocator )的参数指定参数。但并非所有编译器都支持对语言规范的这种修改——请参阅 here live how Clang 6.0.0 refuses 以在启用 C++17 的情况下编译您的原始代码段。对于较旧版本的 C++(或迄今为止的任何版本的 Clang),此代码段可能正是您的目标:

template<template<class, class> class C, typename T, typename A>
void print(const C<T, A>& c){
for(auto& e : c)cout<<e<<endl;
}

在这里,您指定了类型 ( std::vector ) 的正确模板签名,您稍后将使用该类型实例化 print()


不管 C++17 是什么,这也行得通:

template<template<class...> class C, typename T>
void print(const C<T>& c){
for(auto& e : c)cout<<e<<endl;
}

也就是说,请注意,由于 vector<int> 已经是一个完全实例化的类型,这个更简单的版本在给定的代码段范围内同样有效:

template<typename T>
void print(const T& c){
for(auto& e : c)cout<<e<<endl;
}

I changed print() signature from (const C& c) to (C& c), it still fails:

在这种情况下,这可能是更好的做法,因为您没有在 c 内部修改 print() 。但是,这与您的错误无关。

关于C++ 模板的模板编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52345103/

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