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,S]=wavedec2(x,n,wname); %对图像小波分解 你可以把出入参数x先赋值给一个变量,在执行这一句代码 参考技术A 调用的地方在类的成员函数里面,类没有实例化,不检查语法 参考技术B 你看看函数有没有重载,讲道理这样是不行的.本回答被提问者采纳

在 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++中,为啥函数参数不够也可以调用?而且函数模板定义中没有提供默认值。的主要内容,如果未能解决你的问题,请参考以下文章

C++中函数模板和模板函数的区别

C++:调用无参数的构造函数为啥不加括号

C++ 提高教程 模板-普通函数与函数模板调用规则

c++创建链表为啥要用类模板

为啥尝试使用显式类型参数调用模板成员函数时会出错?

为啥我不能在 C++ 中用 new 调用参数化构造函数?