2012-10-10 9 views
5

Poniższy kod nie zostanie skompilowany. Czemu?Niemożliwe: ten wskaźnik jest domyślnym argumentem. Czemu?

Edytuj, dla jasności. To właśnie próbowałem zrobić, używając mniej linii kodu ...

class A 
{ 
    void f(int i){}; 
    void f(); 
    int j; 
}; 

void A::f() 
{ 
    f(j); 
} 
+2

Co jeszcze próbujesz zrobić? –

+3

Ponieważ instancja nie znajduje się w zasięgu wewnątrz deklaracji argumentu ...? –

+2

"... Wyrażenie może łączyć funkcje widoczne w bieżącym zakresie, wyrażeniach stałych i zmiennych globalnych Wyrażenie nie może zawierać zmiennych lokalnych ani niestatycznych zmiennych z podziałem na klasy ..." –

Odpowiedz

6

Domyślne wartości argumentów są powiązane podczas kompilacji.

"ten" jest zdefiniowany tylko w czasie wykonywania, więc nie można go użyć.

Zobacz tutaj pełniejsze wyjaśnienie: Must default function parameters be constant in C++?

+0

ale dlaczego C++ zostało zaprojektowane w ten sposób, że domyślne argumenty muszą być powiązane w czasie kompilacji? ... – alexandreC

+0

@alexandreC to kolejne pytanie. –

0

Inni już skomentował powodu to nie działa. Z jednego z komentarzy:

”... Wyrażenie może łączyć funkcje, które są widoczne w bieżącym zakresie Constant wyrażeń i zmiennych globalnych Wyrażenie nie może zawierać zmienne lokalne lub wykładowa non-statyczne. członek zmienne ...”

można użyć optional wyeliminowanie dodatkowych funkcji, chociaż nie jestem pewien, że to jaśniej:

void f(boost::optional<int> i = boost::none) { if(!i) i = j; ... }

Powiązane problemy