2016-11-08 6 views
0

例えば、sum.hsum.cpp、およびmain.cppの3つのファイルがあります。C++ - デフォルト引数の使用に関する混乱

sum.hから

... 
    int sum (int a, int b, int c=10) { 
     return a + b + c; 
    } 

main.cpp

... 
    cout << sum (1, 2) << endl; 
    ... 

sum.cpp

コンパイラ

... 
    int sum (int, int, int); 
    ... 
too few arguments to function...を言って、エラーがスローされます。

私がコードするとうまくいくのはです。 しかし、ちょうど2つの引数を渡すだけですか?

+2

ヘッダーに既定の引数を設定します。 – drescherjm

答えて

2

デフォルトの関数引数は、コールサイトが認識する関数宣言に入る必要があります。

int sum (int, int, int = 10); 

これらは、関数が呼び出される式で必要です。実装はデフォルトに渡されるかどうかは気にしないでください。

さらに、より小さなスコープで関数を再宣言し、完全に異なるデフォルト引数を与えることができます。このコードスニペットは、C++ 17標準のドラフトから取られたと私は何を意味するかを示していされています、あなたもと同じ関数を宣言異なるヘッダを持つことができ

void f(int, int); 
void f(int, int = 7); 
void h() { 
    f(3);       // OK, calls f(3, 7) 
    void f(int = 1, int);   // error: does not use default 
           // from surrounding scope 
} 
void m() { 
    void f(int, int);    // has no defaults 
    f(4);       // error: wrong number of arguments 
    void f(int, int = 5);   // OK 
    f(4);       // OK, calls f(4, 5); 
    void f(int, int = 5);   // error: cannot redefine, even to 
           // same value 
} 
void n() { 
    f(6);       // OK, calls f(6, 7) 
} 

理論的には、(実際にはこれをしません) 異なるデフォルトのパラメータ値。また、両方が同じ翻訳単位に含まれていない限り、期待どおりに動作します。

int sum (int, int, int=10); 

関数の実装でそれを指定する必要はありません:

+0

@Remy、今後の編集をお勧めしますと感謝しています。私は編集中の段落を失ったばかりです。 – StoryTeller

1

あなたはプロトタイプのデフォルト値(.Hファイル内の関数定義)を指定する必要があります。