1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み] エラー: '...'のメンバー '...'が非クラス型である場合のリクエスト

2021-12-30 10:17:39

質問

2つのコンストラクタを持つクラスがあります。1つは引数を取らないもの、もう1つは引数を取るものです。

引数を1つ取るコンストラクタを使用してオブジェクトを作成すると、期待通りに動作します。しかし、引数を取らない方のコンストラクタを使用してオブジェクトを作成すると、エラーが発生します。

私は2つのコンストラクタを持つクラスを書きました。1つは引数が1つで、もう1つは引数がないものです。

class Foo
{
  public:
    Foo() {};
    Foo(int a) {};
    void bar() {};
};

int main()
{
  // this works...
  Foo foo1(1);
  foo1.bar();

  // this does not...
  Foo foo2();
  foo2.bar();

  return 0;
}

オブジェクトのコンストラクタを引数1つで作成すると正常に動作しますが、引数なしでオブジェクトのコンストラクタを作成するとエラーが発生します(g++ 4.0.1 でコンパイル)。

nonclass.cpp: In function ‘int main(int, const char**)’:
nonclass.cpp:17: error: request for member ‘bar’ in ‘foo2’, which is of non-class type ‘Foo ()()’

解決方法は?

Foo foo2();

に変更する。

Foo foo2;

コンパイラが

Foo foo2()

関数宣言として、名前 'foo2'、戻り値の型 'Foo' を指定しています。

しかし、その場合、次のように変更すると Foo foo2 というエラーが表示されることがあります。 " call of overloaded ‘Foo()’ is ambiguous" .