2011-03-15 21 views
8

, kodu"Geçersiz şablon argümanı" hata ama GCC değil

template <template<class> class BaseType> 
class EST16 
    : public BaseType<int> 
{ 
public: 
    EST16(double d) 
    { 
    } 
}; 

template <class T> 
class SCEST 
{ 
    T y; 
}; 
typedef EST16<SCEST> EST16_SC; 
class Child 
    : public EST16_SC 
{ 
public: 
    Child() 
     : EST16_SC(1.0) 
    { 
    } 

}; 



class NotWorkingChild 
    : public EST16<SCEST> 
{ 
public: 
    NotWorkingChild() 
     : EST16<SCEST>(1.0) 
    { 
    } 

}; 



TEST(TemplateTest, TestInstantiate) 
{ 
    Child child; 
    NotWorkingChild notWorkingChild; 
} 

Çocuğa Sahip ve typedef sadece farklılık NotWorkingChild varsayalım.

2>..\..\..\src\itenav\test\SCKFErrorStateTest.cpp(43) : error C3200: 'SCEST<T>' : invalid template argument for template parameter 'BaseType', expected a class template 
2>  with 
2>  [ 
2>   T=int 
2>  ] 

sen neden bu durumda açıklayabilir: GCC olarak NotWorkingChild yapıcısı aşağıdaki hata üretir Visual Studio, derleme hem? Typedef daha iyi bir taşınabilir çözüm var mı?

Teşekkürler!

sadece şablon sınıf adı, EST16 başvurmak için Başlatıcı değiştirmek eğer VS derler
+1

aslında başlatır ve şablon sınıfları kullanan herhangi bir kod yazdım? Bununla demek istediğim, 'ana' demek. neler olabileceğini bir şey 'typedef' görünce Çocuğunuz sınıfların biri gerçekten kullanılana kadar GCC rahatsız etmez iken VCC, örnekleme testleri olmasıdır. Bu doğruysa, çocuk sınıfı şablonlarından birini kullanan bir kod yazdığınız anda GCC'de de hatalar alırsınız. – phooji

+0

Evet, yaptım. TEST makrosu, aslında main() 'den çağrılan bir Google Testi oluşturur. – Philipp

+0

Maalesef - "TEST" makrosu kaydırma eşiğimin hemen ardındanydı, bu yüzden kaçırdım. Bunun neden başarısız olduğunu% 100 değilim, ancak derleyiciler arasında daha taşınabilir olması gereken alternatif bir yaklaşım yayınladım. Aynı zamanda benim düşünceme göre daha kolay okunabilir, bu – phooji

cevap

11

hata mesajı NotWorkingChild kapsamı yerine şablonun, sınıf SCEST<int> bakın içeride SCEST yapar SCEST<int> dan NotWorkingChild türemiştir (dolaylı olarak), çünkü. MSVC bu reddetmek doğru olduğunu ve GCC4.5 de bu reddetmek gerektiğini (GCC4.5 daha doğru enjekte sınıf adı araması vardır). İşte

biz kapsam çözünürlük operatörünü kullanabilirsiniz ve :: (jeton <: aksi bir digraf olarak alınacaktır) önce boşluk koymak gerekir hem derleyici

class NotWorkingChild 
    : public EST16<SCEST> 
{ 
public: 
    NotWorkingChild() 
     : EST16<::SCEST>(1.0) 
    { 
    } 

}; 

Bildirim için işe yarayabilecek bir çözümdür.


Son Haber: C++ 0x sen EST16<SCEST> yapmak bile yukarıdaki çalışmayı yapacaktır. nedeni enjekte sınıf adı bir şablon şablon parametresi geçirilir ise, enjekte edilen sınıf adı yerine bir türü olarak, bir şablon olarak kabul edilir söylüyor olmasıdır. O halde, C++ 0x için, GCC doğru yapıyor derleyici olurdu.

+0

Seems VS "14" CTP hala kapsam çözünürlük operatörünü gerektirir. –

2

. Yani .:

class NotWorkingChild : public EST16<SCEST> 
{ 
public: 
    NotWorkingChild() 
     : EST16(1.0) 
    { 
    } 
}; 
+1

doğru, ama taşınabilir bir çözüm arıyorum ve bu GCC ile derleme yapmaz :-( – Philipp

İlgili konular