声明一个具有默认指针值的函数

Declare a function with default pointer value

本文关键字:指针 默认 函数 一个 声明      更新时间:2023-10-16

我试图在.cpp文件中声明此函数,但出现编译错误:

错误:为"void print_vector(std::vector&,char*)"的参数2提供了默认参数

void print_vector(vector<int>&c, char *title="");

我怎样才能正确申报?

您显示的声明不足以产生此错误,但如果您将函数声明和实现分离,并且意外地在两者中都有默认值,则可能会出现此错误。请确保仅在其中一个中指定默认参数。

即代替

// declaration, usually in .h
void print_vector(vector<int>&c, const char *title="");
// implementation, usually in .cpp
void print_vector(vector<int>&c, const char *title="") {
    // code
}

进行

// declaration, usually in .h
void print_vector(vector<int>&c, const char *title="");
// implementation, usually in .cpp
void print_vector(vector<int>&c, const char *title) {
    // code
}

或者反过来,即在实现中使用默认值(尽管上面显示的方式通常是首选的,因为它可以让头文件的读者清楚地了解行为和用法)。还要注意const char*以避免警告(甚至AndreyT指出的错误,谢谢!)。

函数的声明只说明如何调用该函数。它不需要匹配,在某些情况下可能不匹配。考虑一个案例:

class T
{
   static int GetDefault();
};
int T::GetDefault()
{
   return 0;
}

这里,在实现中不需要也不需要使用static关键字。某些编译器可能会发出警告,或者某些静态分析工具可能会发出警报(尽管这不会造成伤害)。此外,请注意,参数名称可能不匹配(或者在声明或实现中可能被省略),因为调用者只需要基本原型。

int Compute(int,int);
int Compute(int a, int b) 
{
    return a*b;
}

在默认参数的情况下,您为调用方提供默认参数,而不是为函数本身的实现提供默认参数(除非在类中内联实现)。