【问题标题】:Visual studio not allowing ommision of default parameters?Visual Studio 不允许省略默认参数?
【发布时间】: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.

标签: c++ visual-studio opencv


【解决方案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 文件扩展名。

【讨论】:

    猜你喜欢
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 2012-02-14
    相关资源
    最近更新 更多