2012-12-10 12 views
11

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"?

+4

[Works for me] (http://ideone.com/OlIPKZ). Belki bu bir VisualC++ meselesidir. –

+1

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

+0

@ queen3 +1, oldukça havalı ve yazım hatası tespit ediliyor. şimdi düzeltildi; sorun devam ediyor tho. – zyndor

cevap

12

Bu geçerli C++ gibi görünüyor. Ve diğerlerinin belirttiği gibi, GCC bunu kabul ediyor. Derleyici hatası başına gelince, MSVC'nin ayrıştırıcısında bir hataya benziyor.

Foo* parFoo = new Foo[2]; 
Foo (**ppFoo2)(&parFoo); // compiles in MSVC too 
+0

Bu bildirilen bir hata mı? – nullpotent

+0

Yanıt için ve geçici çözüm için teşekkür ederiz. – zyndor

+0

@iccthedral: Hiçbir fikrim yok. – ybungalobill

2

VS2005 içinde kod sadece

int main() { 
    int** ppFoo(0); 
} 

indirgenebilir ve aynı hatayı oluşturur: parantez ekleyerek Aslında

doğru kod ayrıştırmak için yardımcı olur. Açıkçası, derleyicide bir hata var.

İlgili konular