Visual Studio 不允许省略默认参数?
Posted
技术标签:
【中文标题】Visual Studio 不允许省略默认参数?【英文标题】:Visual studio not allowing ommision of default parameters? 【发布时间】:2011-03-20 20:08:36 【问题描述】:我在使用 opencv 的 C++ 项目中使用 VS2010。 opencv 中的许多调用对于函数的最后几个参数都有默认参数。但是,在函数调用中省略这些参数时,Visual Studio 会抱怨并说"functionname: too few arguments for call
这是视觉工作室的怪癖吗?这是我可以关闭的设置吗?为什么会出现这种情况。代码在g++下编译良好。
编辑
举个例子,
#include <cv.h>
#include <cxcore.h>
int main()
CvMat *rotation_vector = cvCreateMat(3,3, CV_64FC1);
double rotation[] = 0, 1, 0,
-1, 0, 0,
0, 0, 1 ;
cvInitMatHeader(rotation_vector, 3, 3, CV_64FC1, rotation, 2147483647); // works
cvInitMatHeader(rotation_vector, 3, 3, CV_64FC1, rotation); // doesn't work
return 0;
【问题讨论】:
你能提供一个具体的例子吗? 你可以提供一些代码。 VC++ 可以很好地使用默认参数。 输入 cvInitMatHeader() 时,intellisense 会为您提供参数列表。如下:“(CvMat mat, int rows, int cols, int type, void *data = (void)0, int step = 2147483647)” @soxarered:嗯,我希望您在cxcore.h
文件本身中找到实际声明本身。可能有一些宏,智能感知可能不会显示它们。
@soxarered:你的意思是如果__cplusplus
被定义了,那么就使用等号的形式吗?我认为您的 VC++ 项目设置为编译 C 代码而不是 C++ 代码,因此 __cplusplus
最终未定义。 Check your project settings.
【参考方案1】:
cvInitMatHeader()
的声明如下:
CVAPI(CvMat*) cvInitMatHeader( CvMat* mat, int rows, int cols, int type,
void* data CV_DEFAULT(NULL), int step CV_DEFAULT(CV_AUTOSTEP) );
CV_DEFAULT
的定义如下所示:
#ifdef __cplusplus
#define CV_DEFAULT(val) = val
#else
#define CV_DEFAULT(val)
#endif
看来您的 Visual C++ 编译器实际上是在 C 模式而不是 C++ 模式下编译。在 C 模式下,__cplusplus
不会被定义,所以 CV_DEFAULT
扩展为空。因此,函数声明似乎没有默认参数。
Check your project settings 并确保您在 C++ 模式下编译代码。也就是说,确保启用了/Tp
或/TP
编译器开关。您还应该确保您的 C++ 文件具有 .cpp
文件扩展名。
【讨论】:
以上是关于Visual Studio 不允许省略默认参数?的主要内容,如果未能解决你的问题,请参考以下文章
变量 args SFINAE 默认构造函数在 clang 中工作,但在 Visual Studio 2015 中失败
Visual Studio Code使用Open In Browser打开的是记事本