2011-05-13 25 views
6

Aşağıdaki kod ile sorun var "olmayan sınıf türü olarak zaten bir sınıf türü olarak ilan edildi":İleri ilan tipi ve

template <typename T> 
    void foo(struct bar & b); 
    struct bar {}; 
    int main(){} 

Bu GCC üzerinde başarıyla derler, fakat MSVC (2008) üzerine başarısız aşağıdaki hata:

C2990: 'bar' : non-class type as already been declared as a class type

kodu yanlış mı yoksa MSVC bir hata var? Ben şablon tanımının önce struct bar; eklerseniz

Çalışıyor.

+1

Ayrıca VC++ 2010. Ve Tanrı ile başarısız, ne korkunç C + + geliştirme için IDE oldu! –

cevap

3

Ve bizim kazanan var:

https://connect.microsoft.com/VisualStudio/feedback/details/668430/forward-declared-type-and-non-class-type-as-already-been-declared-as-a-class-type

Thank you for reporting this issue. This is indeed a case of non-conformant behaviour in VC++. However, a simple workaround is to reorder the declarations so that the declaration "struct bar" is known when the template declaration is encountered. Due to the low severity of this bug and our priorities, we regret that we cannot fix the bug in the next release of the compiler but we will consider it for a future release.

Regards,

Tanveer Gani Visual C++ Team

0

Büyük olasılıkla bir yere (muhtemelen bir başlık dosyasına) bu kod bloğunun üstünde struct bar {}; var. Bkz http://msdn.microsoft.com/en-us/library/zfcw8kk9.aspx Düzenleme

: foo yana

C2990 can also occur due to a breaking change in the Visual C++ compiler for Visual C++ 2005; the compiler now requires that multiple declarations for the same type be identical with respect to template specification.

şablon olarak değiştirilebilir ve bar Eğer struct bar {};foo üstüne taşınıyorsa foo argüman listesinde, ne olur "ileriye ilan" ediliyor: Yukarıdaki bağlantıdan Ayrıca ?

Çoğu durumda
+0

Hayır, bu dolu, minimum kod. –

+0

@Hello Yorumunuzda düzenlenmiş temel. –

+0

Düzenlemenize yanıt verin: evet, o zaman işe yarayacaktı. Ayrıca, struct bar eklerseniz çalışır. Sorunun içinde yazmış olduğum gibi, şablon tanımı gibi. –

3

, bir C (veya C++ derleyicisi) kaynak kodunda kesinlikle yukarıdan alt çalışır. Hiç aksi derleyici var olduğunu bilmez, struct bar başvuru girişiminde önce Yani bir forward declaration gerekir. Geçerli kod benziyor

+0

Satır içi ileri bildirim yapabilirsiniz. Void foo (struct bar & b); 'gibi. ** struct ** anahtar sözcüğü ileri bildirimdir. –

+0

@Hello: Gerçekten mi? Yanlış olduğunu söylemiyorum, sadece bunu daha önce hiç görmemiştim. Bir referans sağlar? –

+0

@Oli: Şablon olmadan deneyin, derler. :) – Xeo

0

. MSVC ne yapıyorsa yapsın, görebildiğim kadar tuhaf bir uyumsuz davranış gibi görünüyor.