2016-03-26 5 views
0

Ich habe eine Basisklasse, class A<T>, und eine abgeleitete Klasse, class B : public A<string>.g ++ Fehler Basiskonstruktor für Feld und ignoriert Parameter

class A hat einen Konstruktor, der eine Ganzzahl als einzigen Parameter und einen Standardkopiekonstruktor verwendet. Es hat keinen parameterlosen Standardkonstruktor (nicht einen, den ich definiert habe; ich weiß, dass der Compiler einen solchen erzeugt, der mit meinem Problem zusammenhängen könnte).

Der Konstruktor für class B wie folgt aussieht:

B() 
: A(37) 
{ 

} 

die Fehler Ich erhalte sind:

Der Compiler Fehler der Basiskonstruktor Aufruf für eine Feldinitialisierung

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

Und

Der Compiler denkt einen Standard (Par ameterless) Basisklassenkonstruktor verwendet wird, und schlägt vor, sowohl der Nicht-Standard-Basisklassenkonstruktoren ...

// 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> >] 

... von denen übereinstimmen sollte, was genannt wird.

// 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> >] 

Ich glaube, diese Fehler aus dem Weg kommt mein Compiler installiert oder konfiguriert, denn wenn ich meinen Code auf meinem Computer zu kompilieren, ich habe keine Fehler, aber ich bekomme die aufgelisteten Fehler oben, wenn ich scp alles auf meinem Computer der Schule und kompilieren Sie es dort. Ich benutze g ++ an beiden Orten, aber offensichtlich gibt es irgendwo einen Unterschied. Was ist dieser Unterschied und woher kommt der Fehler?

Es existiert kein Konvertierungsoperator von A nach int und umgekehrt.

Ich verwende C++ 03 auf beiden Systemen.

Hier ist eine vollständige Codebeispiel, das die Fehler wiedergibt (auch hier nur auf dem einen System):

/******************************* 
* 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

Wo mache ich das? –

+0

'Klasse B: öffentliche Klasse A ' - Hat es wirklich so kompiliert, mit dem Wort 'class' vor' A '? – AnT

+0

Gr. Nein, tut mir leid, es ist nur "Klasse B: öffentlich A ". Ich werde es jetzt bearbeiten. –

Antwort

1

Zum einen wird der Standard-Konstruktor für A nicht vom Compiler generiert. Wenn es mindestens einen definierten Konstruktor mit Parametern gibt, wird der Standardkonstruktor nicht generiert.

Zweitens kommt Ihr Problem von der Tatsache, dass Sie den Template-Parameter von A im B-Konstruktor nicht angeben. Sie haben zu schreiben:

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

Wenn Sie A (37) der Compiler schreiben für die nicht auf Vorlagen basierende Klasse A sieht das gar nicht existiert.

Die Basisklassen werden immer konstruiert. Da Sie A nicht konstruieren, wird der Compiler dies tun, wenn Sie den Standardkonstruktor aufrufen. Da es nicht existiert, schlägt es fehl.

+0

Verwenden von 'A (37)' anstelle von 'A (37)' funktioniert perfekt auf einem System mit g ++, aber nicht auf einem anderen System mit g ++. Ich verstehe, dass 'A ' ein expliziter Typspezifizierer ist, aber warum wird das nur auf einem System benötigt? –

+1

Dies sollte nicht funktionieren. Aber es ist sicherlich die Implementierung definiert. Eine Ihrer Implementierungen könnte vermuten, dass Sie A in B-Konstruktor meinen, weil Sie B von A in der Klassendeklaration abgeleitet haben. – Thomas

+0

Was meinen Sie "Implementierung definiert"? g ++ ist g ++, oder? –

Verwandte Themen