trileri'yi dmd 2.038'den beri derleyemiyorum. Bunun bir derleyici hatası yüzünden olduğunu düşünmüştüm ama 2.043'te de aynı olunca sordum:
http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=19416
Sorun, "merhaba" şeklinde yazılan dizgi hazır değerlerinin türünde.
Benim bu güne kadar sandığım şuydu:
"merhaba"c -> string
"merhaba"w -> wstring
"merhaba"d -> dstring
"merhaba" -> string (yanlış biliyormuşum)
Sonuna c yazılmayan hazır değerlerin de string olduklarını sanıyordum. Yukarıdaki konuda öğrendiğime göre, türleri özellikle belirtilmeyen dizgi sabitleri, kullanımlarına göre belirleniyormuş.
Bunun bir kısmını biliyordum. Örneğin
dstring dizgi = "merhaba";
yazıldığında elimizde dstring türünden bir dizgi olduğu için onun "merhaba" ile ilklendiğini anlıyordum. Zaten başka bir şey de beklenemez...
Bilmediğim bir şey, hazır değer, C türünden bir dizgi ile ilklendiğinde, sonuna ''\0'' karakteri bile yerleştiriliyormuş:
const char * dizgi = "merhaba"; // C türü dizgi; sonunda '\0' var
Yani "merhaba", 4 farklı tür yerine geçebiliyormuş. Buraya kadar tamam.
Bir sorun, işlev yüklemede ortaya çıkıyor:
void foo(const(char)[])
{}
void foo(const(wchar)[])
{}
void foo(const(dchar)[])
{}
void main()
{
foo("merhaba"); // <-- hangi foo?
}
"merhaba"nın türü benim yanlış bildiğim gibi string olmadığı için, derleyici hangi işlevi çağıracağını bilemiyor:
deneme.d(10137): Error: function deneme.foo called with argument types:
((string))
matches both:
deneme.foo(const(char)[] _param_0)
and:
deneme.foo(const(dchar)[] _param_0)
main'deki çağrının hem char dizisi alana, hem de dchar dizisi alana uyduğunu söylüyor. (Nedense o iki türü seçiyor ve susuyor. Bunlardan birisini silince wchar'lı işleve uyduğunu da söylemeye başlıyor.)
Ara not olarak, "merhaba"nın türü tek başına sorgulandığında string seçiliyor:
writeln(typeof("merhaba").stringof); // "string" diyor
Bu yüzden, trileri'deki Dizgi'nin opEquals işlevini istediğim gibi yükleyemiyorum; çünkü dizgi=="merhaba" yazıldığında hangi opEquals'un çağrılacağı bilinemiyor.
Ne yapmak gerek? Böyle bir kütüphane D'nin dizgilerinden hangisini desteklemeli? string daha yaygın olduğu için yalnızca string'le mi çalışmalı? Yoksa kendisi perde arkasında bir dchar dizisi kullandığı için yalnızca dstring'le mi çalışmalı?
Yukarıdaki konuda sordum. Öğreneceğim... :)
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]