C++中,为啥函数参数不够也可以调用?而且函数模板定义中没有提供默认值。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中,为啥函数参数不够也可以调用?而且函数模板定义中没有提供默认值。相关的知识,希望对你有一定的参考价值。
这个函数模板定义,有4个参数:
template < class Graph >
void computeStrongComponents (std::vector<std::deque<typename Graph::Vertex> > * output, const Graph & G, std::deque<typename Graph::Vertex> * topological_sort, std::deque<typename Graph::Vertex> * SCC_root ) ...
这个函数调用,只有3个参数:
computeStrongComponents ( &components, mapgraph, &topological_sort );
在 C++ 模板中省略参数
【中文标题】在 C++ 模板中省略参数【英文标题】:Omitting arguments in C++ Templates 【发布时间】:2009-07-17 22:55:47 【问题描述】:调用模板函数时可以省略函数名后面的类型吗?
例如,考虑下面的函数:
template<typename T>
void f(T var)...
这样简单的称呼可以吗:
int x = 5;
f(x);
或者我是否有包含类型?
int x = 5;
f<int>(x);
【问题讨论】:
你不能试试看会发生什么吗?似乎很容易测试。 @ Ed Swangren,“试一试”的方法信息量不大。充其量它会告诉您特定的编译器允许给定的语法。它没有告诉你关于语言标准的语句的语义或正确性。 我想我可以澄清这个问题。正如 Trent 友好地指出的那样,它是否能够编译并不是那么重要。我很好奇幕后发生的事情,很难找到好的信息! @Chris:我认为您接受的答案不是很好的信息。它甚至没有任何意义,并且遗漏了许多细节。 【参考方案1】:只要编译器可以从函数参数中推断出模板参数,就可以将它们排除在外。这也是一种很好的做法,因为它会使您的代码更易于阅读。
另外,你只能留下结尾的模板参数,而不是开头或中间:
template<typename T, typename U> void f(T t)
template<typename T, typename U> void g(U u)
int main()
f<int>(5); // NOT LEGAL
f<int, int>(5); // LEGAL
g<int>(5); // LEGAL
g<int, int>(5); // LEGAL
return 0;
【讨论】:
【参考方案2】:使用隐式模板参数调用它并没有错。编译器会通知您是否感到困惑,在这种情况下,您可能必须显式定义模板参数才能调用该函数。
【讨论】:
Zifre,我认为他的意思是“在这种情况下,您可能必须在函数调用中明确包含模板参数”。 我不谈论显式或隐式调用函数我谈论显式定义模板参数... @DeusAduro 你能解释一下吗?我考虑如何调用函数,它激发了我的设计/定义。您是在进行语义区分还是我误解了什么?以上是关于C++中,为啥函数参数不够也可以调用?而且函数模板定义中没有提供默认值。的主要内容,如果未能解决你的问题,请参考以下文章