2010-06-04 11 views
5

Bugün arkadaşlarımdan biri şu kod onun Visual Studio 2008 de derler söyledi:Visual C++ Derleyici, "typename" olmayan bir isim olarak bağımlı isim verir?

#include <vector> 
struct A 
{ 
    static int const const_iterator = 100; 
}; 
int i; 
template <typename T> 
void PrintAll(const T & obj) 
{ 
    T::const_iterator *i; 
} 
int main() 
{ 
    std::vector<int> v; 
    A a; 
    PrintAll(a); 
    PrintAll(v); 
    return 0; 
} 

Genellikle g ++ kullanın ve her zaman ikinci PRINTALL() çağrısını geçmek reddediyorum. Bildiğim gibi, bu sorun için, g ++ bir şablonu tercüme etmenin standart yolunu yapıyor.

Bilgim yanlış mı, yoksa VS2008'in uzantısı mı?

+0

Bu,/Za (katı) veya/Ze (varsayılan, uzantılar) ile mi? – MSalters

+0

@MSalters: Hemen şimdi/Za ile çalıştım. Herhangi bir fark görmediniz ... – hpsMouse

cevap

8

Bu bir uzantı değildir. şablonu ayrıştırmak ve örnekleme noktasında olmayan tüm bağımlı isimler

  • belirlemek, şablonu geçerli ürettiğini kontrol tanımının noktada

    1. :

      VC++ düzgün iki faz yorumunu hiç uygulanmamış Kod

    VC++ hiçbir zaman ilk aşamayı uygulamamıştır ... bu, yalnızca uyumlu olmayan bir kod kabul ettiği anlamına gelmediği için değil, aynı zamanda bazı durumlarda tamamen farklı bir kod oluşturduğu anlamına da gelir. o T bağlı değildir şablonun tanımı ve foo kararı noktasında kullanılabilecek tek tanım çünkü

    • uyumlu derleyici, "int" yazdırır: Bu kod ile

      void foo(int) { std::cout << "int" << std::endl; } 
      
      template <class T> void tfoo() { foo(2.0); } 
      
      void foo(double) { std::cout << "double" << std::endl; } 
      
      int main(int argc, char* argv[]) 
      { 
          tfoo<Dummy>(); 
      } 
      

      .

    • VC++ o Aptalca kadarıyla farklılıklar gitmek gibi görünebilir 1

    fazı ile rahatsız etmemişti, çünkü "çift" yazdırmak, ancak sayı düşünürsen orada büyük bir programda var kapsamaktadır arasında olacak Birisi şablon kodunuzdan sonra aşırı yüklenme riski taşır ... ve BAM:/

  • +0

    En azından bir uyarı oluşturmak için 'VC++' almanın herhangi bir yolu var mı? Bu davranış, birden çok derleyicide çalışması gereken kod için bir sıkıntıdır. Ekibimizdeki geliştiriciler, her zaman anahtar kelimeyi eklemeyi unutuyorlar ve kod, "Clang" – Samaursa

    +1

    @Samaursa'da derlenemedi: Ne yazık ki, bilmiyorum. Clang kullanıyorsanız, VC++ için bir drop-in sürücü geliştirdiğini bilmek ilginç olabilir, bu yüzden doğrudan Visual Studio'dan Clang'ı çağırabilirsiniz. –

    1

    "Uzantı" nın VC++ 'yı bu bağlamda tam olarak nasıl tanımlayacağından emin değilim, fakat evet, gcc'nin bu konuda daha iyi bir uyumu var.

    +0

    Visual Studio'nun izin verme modunda bu davranış değil mi? Kodu katı modda reddedeceğini ve bu uzantıyı VC6 ile geriye dönük uyumluluk için uygulayacağını düşünüyorum. – MSalters

    +0

    @MSalter: Hayır, VC++/Za ile bile kodu kabul eder. –