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打开的是记事本

Visual Studio 错误:/W 需要一个参数

省略号交换机案例Visual Studio等效

为啥 Visual Studio 从我发布的 ASP.net 项目中省略“.compiled”文件?

Visual Studio 不允许我使用某些变量名