【问题标题】:Declare a function with default pointer value用默认指针值声明一个函数
【发布时间】:2014-11-08 07:19:57
【问题描述】:

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

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

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

如何正确声明?

【问题讨论】:

    标签: c++


    【解决方案1】:

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

    即而不是

    // 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 中从语言中删除。
    • @Oguk 你是对的。我的实现与您答案中第一部分的声明相同。一旦我把它改成第二个公园,它就可以工作了。
    • @AndreyT 添加到我的答案中,谢谢,不知道!
    • string title="" 有同样的问题。在这种情况下,string 或 char * 不是关键点。
    • @user1443721 很高兴我能帮上忙。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 2013-07-05
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多