Bir gösterici için bir işaretçi tanımlayan kurucu çağırma gösterimi (declare-) kullanırken (atama gösterimi yerine - tabii ki aynı anda çalışma zamanını yapar; sadece bir kuraldır), bir derleyici hatası alıyorum. Neden olduğunu merak ediyordum.Yapıcı çağırma gösterimi ile işaretçi değişkenine bir işaretçi tanımlamak neden yasa dışıdır?
struct Foo
{ /* ... */ };
int main(int argc, char** argv)
{
Foo* parFoo = new Foo[2];
Foo** ppFoo(&parFoo); // invalid: C2059
Foo** ppFoo = &parFoo; // OK
delete[] parFoo;
}
Hata, C2059 geçersiz bir belirtecidir; Ancak, &
sorun değil (bu muhtemelen bir operatör önceliği hatası olması anlamına gelir). Ben aşağıdakileri yapın:
int main(int argc, char** argv)
{
Foo* parFoo = new Foo[2];
Foo** ppFoo = &parFoo; // OK
Foo** ppFoo2(ppFoo); // invalid: C2061
delete[] parFoo;
}
... sonra bu kez yanlış yerde var ppFoo
tanımlayıcı var, yani bir C2061 olsun.
sözdizimsel hangi kural bu neden
, yani neden yapıcı çağırma notasyonu işaretçiler işaretçileri tanımlamak için kullanılamaz, sadece türleri "daha az derecede işaret etti"?
[Works for me] (http://ideone.com/OlIPKZ). Belki bu bir VisualC++ meselesidir. –
1. örnek ideone.com'u kullanarak iyi bir derleme yaptı (gcc I guess). İkinci olarak muhtemelen bir hata yaptınız, Foo ** ppFoo2 (ppFoo) olmalı? <- not ppFoo. Aslında ilk örnekte de hata var (çoğaltılmış isimler) ama bu küçük. Ideone.com öneri için – queen3
@ queen3 +1, oldukça havalı ve yazım hatası tespit ediliyor. şimdi düzeltildi; sorun devam ediyor tho. – zyndor