2010-11-21 5 views
9

Ben Linux gcc ortamında çalışıyorum ile sınıflardır fonksiyon argümanları başlatmak ve varsayılan değerlerle sınıflardır fonksiyon argümanları initilize ihtiyacımız. Sınıfın geçici örneği ile böyle bir hata yapar bunu yaparken : için "varsayılan argüman [fonksiyon argüman] [sınıf adı] yazın etti örneğin:.nasıl varsayılan değer

void foo(std::wstring& str = std::wstring()) 

hatası: 'varsayılan argüman std :: & str wstring std :: wstring 'Bu kodu herhangi hatasız veya VC++ ile uyarı derlenmektedir PS' yazın bulunur. Ben varsayılan değer initilize nasıl

?

+0

size ulaşmak için ne çalışıyorsunuz? Bana göre, ne yaptığınızı anlamsız görünüyor .. – Simone

+0

@Simone - bu muhtemelen varsayılan değerlerin hem avantajlarını almak hem de referans olarak göndermek için bir deneme. Yapılandırılmamış başvurulara – rkellerm

+0

bağlama standart olarak uyumlu değildir, ancak VC++ bunu bir uzantı AFAIK olarak sağlar. –

cevap

8

Bu derleme değil gerekiyordu. Bir const olmayan referansa bir rıhtımı bağlamaya çalışıyorsunuz. std::wstring const & str deyin ve işe yaramalısınız.

9

sadece bir yaratabilecek aşırı fonksiyon:

void foo() { 
    std::wstring str; 
    foo(str); 
} 

ama gerçekten noktası özledim.

DÜZENLEME: Yani bu işlevin amacı bir giriş dizesini değiştirmeniz ihtimalle öyledir. Daha sonra erişemeyeceğiniz boş bir giriş dizesi sağlarsanız, neden rahatsız olur?

+0

Fonksiyonun amacı, giriş dizgesini değiştirmeden de alabilir. Referans yoluyla geçirme, kopya kurucusunun çağrılmasını engellemek için de olabilir. – rkellerm

+0

, yararlı olabileceği birçok durum vardır, örneğin bunun bir dize değil, bir arabellek olduğunu veya bazı verilerin (ayrıntılı günlükler gibi) bu yöntem tarafından koyulduğunu söyleyebilirsiniz, ancak yalnızca sonucu önemsersiniz. Çözümün nazikçe konuyu çözer standart uyumlu kod yine :) –

+0

@ rursw1 evet, ama - bu gibi durumlarda - Geçmek yoksa bir ** const ** Ben işlevin arayüzü şekilde yanlış olduğunu düşünüyorum başvuru. – Simone

3

Sen SağDeğerler için const olmayan başvuruları bağlamak mümkün değil. değeriyle Geçme çalışacak:

void foo(std::wstring str = std::wstring()) 

Veya geçen bir referans-to-Kat tarafından:

void foo(const std::wstring& str = std::wstring()) 
+0

Son cümlenin anlamıyorum. Derleyici geçici olarak optimizasyon yapmasa bile ve kopya ne kadar pahallı bir boş kopyanın kopyasını gerçekten kopyalayacak? Ve eğer geçici olarak seçilirse, ne kaldı? –

+0

@Charles: Bir kullanıcı * argüman olarak bir dize sağladığında ne olur? Daha sonra C++ 03'te kopyalanmalıdır. – fredoverflow

+0

Üzgünüz, yorumunuzdaki varsayılan argümanın kullanıldığını düşündüğümüzü düşündüm. Her halükarda, kullanıcı birçok durumda geçici olan bir dizge sağlıyorsa, C++ 03'te seçilebilir. Bir kopyanın her zaman olması gerekmez. –