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)
{
}
};
Wo mache ich das? –
'Klasse B: öffentliche Klasse A' - Hat es wirklich so kompiliert, mit dem Wort 'class' vor' A '? –
AnT
Gr. Nein, tut mir leid, es ist nur "Klasse B: öffentlich A". Ich werde es jetzt bearbeiten. –