私は基底クラスclass A<T>
とderrivedクラスclass B : public A<string>
を持っています。g ++はフィールドの基本コンストラクタを間違えて、それに対するパラメータを無視します
class A
には、唯一のパラメータとして整数をとるコンストラクタと標準コピーコンストラクタがあります。パラメータのないデフォルトのコンストラクタはありません(私が定義したコンストラクタではありません;私はコンパイラが私の問題に関連しているものを作成している可能性があることに気づきます)。
class B
のコンストラクタは次のようになります。
B()
: A(37)
{
}
私は取得していたエラーは以下のとおりです。
フィールドの初期化のための基本コンストラクタ呼び出し
fileB.h: In constructor ‘B::B()’:
fileB.h:25: error: class ‘B’ does not have any field named ‘A’
コンパイラのミスや
コンパイラはデフォルト(par ameterless)基底クラスのコンストラクタが呼び出されているものと一致する必要があります...
// 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> >]
...のいずれかを使用して、デフォルト以外のベースクラスのコンストラクタの両方を示唆しています。
// 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> >]
私は自分のコンピュータ上で私のコードをコンパイルするとき、私はすべてのエラーを取得しないため、このエラーは、私のコンパイラがインストールまたは設定された方法から来ていると信じていますが、私は時に上記のエラーが出るI私の学校のコンピュータにすべてをscpし、コンパイルしてください。私は両方の場所でg ++を使用していますが、明らかにどこかに違いがあります。その違いは何ですか?エラーはどこから来ていますか?
Aからintへの変換演算子は存在しません。また、その逆もありません。
私は両方のシステムでC++ 03を使用しています。
はここでエラーを再現する完全なコードサンプルです(再び、唯一のシステム上):
/*******************************
* 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)
{
}
};
私はそれをどこにしていますか? –
'class B:public class A' - 'A 'の前に' class'という言葉で実際にコンパイルしましたか? –
AnT
Grr。いいえ、申し訳ありません、それは単に 'class B:public A'です。私は今それを編集します。 –