2016-03-26 14 views
0

class A<T>, ve class B : public A<string> bir derde sınıf sınıfım var.g ++ hatalar temel kurucu alan için ve parametreleri göz ardı eder

class A, tek parametresi olarak bir tam sayı ve standart bir kopya kurucusu alan bir kurucuya sahiptir. Parametresiz bir varsayılan kurucuya sahip değil (tanımladığım bir tanıma sahip değil; derleyicinin, benim sorunumla ilgili olabilecek bir tane oluşturduğunu fark ediyorum).

class B için yapıcı şöyle

: Ben alıyorum

B() 
: A(37) 
{ 

} 

hataları şunlardır: a saha başlatma için

derleyici hataları temel kurucu çağrı

fileB.h: In constructor ‘B::B()’: 
fileB.h:25: error: class ‘B’ does not have any field named ‘A’ 

Ve

Derleyici varsayılan olduğunu düşünüyor (eşit ameterless) taban sınıfı yapıcısı çağrıldığını ne eşleşmelidir ...

// Where is it getting this? A() is never written explicitly 
fileB.h:25: error: no matching function for call to ‘A<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::A()’ 
fileA.h:37: note: candidates are: A<T>::A(const A<T>&) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >] 

... birini kullanılan ve varsayılan olmayan taban sınıfı inşaatçı hem anlaşılacağı ediliyor.

// This one matches A(37), right? 
fileA.h:24: note:     A<T>::A(const int&) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >] 

benim bilgisayarda benim kod derleme, ben herhangi bir hata alamadım çünkü bu hata, benim derleyici kurulmuş ya da yapılandırılmış bir şekilde geliyor inanıyorum ama, yukarıda listelenen hatalar olsun ben Her şeyi okulumun bilgisayarına yaz ve orada derle. Her iki yerde de g ++ kullanıyorum ama belli ki bir yerlerde bir miktar farklılık var. Bu fark nedir ve hata nereden kaynaklanıyor?

A'dan int'ye ne de tersi için herhangi bir dönüştürme işleci yok.

Her iki sistemde de C++ 03 kullanıyorum.

Burada hataları yeniden üreten bir tam kod örneği var (yine yalnızca bir sistem üzerinde):

/******************************* 
* fileA.h 
******************************/ 

template <class T> 
class A 
{ 
    int member; 

    public: 

    A(const int & m) 
     : member(m) 
    { 
    } 

    A(const A & copyFrom) 
    { 
     member = copyFrom.member; 
    } 
}; 


/******************************* 
* fileB.h 
******************************/ 

#include <string> 
#include "fileA.h" 

using namespace std; 

class B : public A<string> 
{ 
    B() 
     : A(37) 
    { 

    } 
}; 
+0

Bunu nerede yapıyorum? –

+0

'B sınıfı: genel sınıf A ' - gerçekten bir "" A sınıfı sözcüğü ile gerçekten böyle derledim? – AnT

+0

Grr. Hayır, üzgünüm, bu sadece B sınıfı: A '. Şimdi düzenleyeceğim. –

cevap

1

Öncelikle, A için varsayılan yapıcı derleyici tarafından oluşturulmaz. Parametreli en az bir tanımlı kurucu varsa, varsayılan kurucu oluşturulmaz.

İkinci olarak, sorununuz, B yapıcısında A'nın şablon parametresini belirtmediğiniz gerçeğinden kaynaklanmaktadır.

B() : A<string>(37) {} 

A (37) yazdığınızda derleyici yok olmayan Templated sınıf A arar: Sen yazmak zorunda.

Temel sınıflar her zaman oluşturulur. Yapılandırdığınız gibi bir derleyici varsayılan yapıcıyı çağırdığınızda bunu yapar. Var olmadığı için başarısız olur.

+0

'A (37)' yerine 'A (37)' kullanmak g ++ kullanarak tek bir sistemde mükemmel çalışır, ancak g ++ kullanan başka bir sistemde çalışır. "" ifadesinin daha açık bir tür belirtici olduğunu anlıyorum, ancak bu neden yalnızca bir sistemde gerekiyor? –

+1

Bu işlem yapılmamalıdır. Ama kesinlikle uygulama tanımlıdır. Uygulamanızdan biri, B bildiricisinde A anlamına geldiğinizi tahmin edebilir, çünkü sınıf bildiriminde A 'dan B türetilmiştir. – Thomas

+0

"Uygulama tanımlı" derken ne demek istiyorsun? g ++, g ++ değil mi? –