2012-10-10 22 views
5

Aşağıdaki kod derlenmez. Niye ya? Netlik için düzenleme yapın, açıklık için düzenleyin. Daha az satırdaki kodları kullanarak yapmaya çalıştığım şey buydu ...Mümkün değil: Bu işaretçi varsayılan argüman olarak. Niye ya?

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

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

Burada yapmaya ne deniyorsunuz? –

+3

Örnek, argüman bildiriminin içinde kapsam içinde olmadığından ...? –

+2

"... İfade, geçerli kapsamda görülebilen işlevleri, sabit ifadeleri ve genel değişkenleri birleştirebilir. İfade, yerel değişkenleri veya statik olmayan sınıf üyesi değişkenleri içeremez ..." –

cevap

6

Varsayılan argüman değerleri derleme zamanında ciltlenir.

"Bu" sadece çalışma zamanında tanımlanmıştır, bu nedenle kullanılamaz.

daha eksiksiz bir açıklama için buraya bakınız: Must default function parameters be constant in C++?

+0

ama neden C++ bu şekilde tasarlanmış, bu varsayılan argümanlar derlenmiş zamanda bağlı olmak zorunda? ... – alexandreC

+0

@alexandreC başka bir sorudur. –

0

Diğerleri zaten bu işe yaramazsa nedeni yorumladı. yorumların birinden:

" ... ifade geçerli kapsamı, sabit ifadeler ve genel değişkenler görülebilir fonksiyonları birleştirebilirsiniz ifadesi yerel değişkenleri veya statik olmayan sınıf-içeremez. üye değişkenler ..."

Sen bunu daha net olduğundan emin değilim rağmen ekstra işlevini ortadan kaldırmak için optional kullanabilirsiniz:

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