gpt4 book ai didi

c++ - c++中重载递归函数的模板推导规则

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:24 25 4
gpt4 key购买 nike

我找到了很多关于模板推导的信息(例如 C++ templated function overloading rules ),但它并不能帮助我理解重载递归函数的模板推导行为。在下面的代码中,我不太明白编译器是如何推断出它应该使用 vector<T> 的。 vectvect 函数两次和 pair<T,U>两次 pairpair - 但它可以。因此,我不明白为什么它不能推断出它应该同时使用 vector<T>pair<T,U> vectpair 的函数?

这与为什么 const 有关吗?关键字导致增加转换,从而使 T功能更好? (但是在这种情况下,其他两个示例如何工作?)

这两个第一次推导是否可能只是因为当前函数在递归调用中首先测试模板推导?

#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

template<class T> string print(const T& t){
ostringstream s;
s << t;
return s.str();
}

template<class T> string print(const vector<T>& t){
ostringstream s;
s << '[';
for(int i=0;i<(int)t.size();i++)
s << print(t[i]) << ' ';
s << ']';
return s.str();
}

template<class T,class U> string print(const pair<T,U>& t){
ostringstream s;
s << '(' << print(t.first) << ',' << print(t.second) << ')';
return s.str();
}

int main ( int argc, char **argv ) {
vector<vector<double> > vectvect(4,vector<double>(4));
for(int i=0;i<(int)4;i++)
for(int j=0;j<(int)4;j++)
vectvect[i][j] = i*4+j;
pair<int,pair<string,double> > pairpair = make_pair(10, make_pair("foo",0.5));
vector<pair<int,string> > vectpair(1,make_pair(42,"bar"));

///template deduction
cout << print(vectvect) << endl;
cout << print(pairpair) << endl;

///template deduction failure
//====> here is the problem
//cout << print(vectpair) << endl;

return 0;
}

目前,我只是想了解,但如果有人知道如何在不引入大量源开销的情况下做到这一点,我很感兴趣。

谢谢。

最佳答案

问题与模板参数推导无关,也与重载解析无关。 print 重载采用一对未被编译器选择,因为它无法通过非限定名称查找找到,ADL 也无法找到。你应该重新排序你的函数的两个定义,以便第一个接受一对的定义:

template <class T,class U> string print(const pair<T,U>& t){
/**/
}

template <class T> string print(const vector<T>& t){
/**/
}

或者在定义和使用它们之前声明所有函数:

template <class T> string print(const T& t);
template <class T,class U> string print(const pair<T,U>& t);
template <class T> string print(const vector<T>& t);

关于c++ - c++中重载递归函数的模板推导规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32874397/

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