【发布时间】:2014-11-08 07:19:57
【问题描述】:
我试图在 .cpp 文件中声明此函数,但出现编译错误:
错误:为 'void print_vector(std::vector&, char*)' 的参数 2 提供了默认参数
void print_vector(vector<int>&c, char *title="");
如何正确声明?
【问题讨论】:
标签: c++
我试图在 .cpp 文件中声明此函数,但出现编译错误:
错误:为 'void print_vector(std::vector&, char*)' 的参数 2 提供了默认参数
void print_vector(vector<int>&c, char *title="");
如何正确声明?
【问题讨论】:
标签: c++
您显示的声明不足以产生此错误,但如果您将函数声明和实现分开并且不小心在两者中都有默认值,则可能会出现此错误。确保只在其中一个中指定默认参数。
即而不是
// 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 指出的错误,谢谢!)。
【讨论】:
char * 不再仅仅是一个警告。它完全在 C++11 中从语言中删除。
一个函数的声明只是说明如何调用这个函数。它不需要匹配,在某些情况下它可能不匹配。考虑一个案例:
class T
{
static int GetDefault();
};
int T::GetDefault()
{
return 0;
}
这里,不需要在实现中使用static关键字。某些编译器可能会呈现警告,或者某些静态分析工具会呈现警告(尽管它没有害处)。另外,请注意参数名称可能不匹配(或可能在声明或实现中省略),因为调用者只需要基本原型。
int Compute(int,int);
int Compute(int a, int b)
{
return a*b;
}
如果是默认参数,您为调用者提供默认参数,而不是为函数本身的实现(除非在类中内联实现)。
【讨论】: