web-dev-qa-db-ja.com

非クラスタイプのメンバーのリクエスト

このエラーが発生し、自分で解決できません

source.cpp:85:8: error: request for member ‘put_tag’ in ‘aux’, which is of non-class type ‘Keyword()’
source.cpp:86:8: error: request for member ‘put_site’ in ‘aux’, which is of non-class type ‘Keyword()’
make: *** [source.o] Error 1

私にこのエラーを与えるコードは

Keyword aux();
aux.put_tag(Word);
aux.put_site(site);

Wordとサイトはchar *タイプであることを言及する必要があります

さて、私のキーワードクラスの定義はこれです:

class Keyword{
 private:

std::string tag; 
Stack<std::string> weblist;

public:

    Keyword();
    ~Keyword();
    void put_tag(std::string Word)
    {
        tag = Word;
    }
    void put_site(std::string site)
    {
        weblist.Push(site);
    }

};

どうもありがとうございました!

更新

変更することにより

Keyword aux();
aux.put_tag(Word);
aux.put_site(site);

Keyword aux;
aux.put_tag(Word);
aux.put_site(site);

このエラーが発生しました:

source.o: In function `Algorithm::indexSite(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
source.cpp:(.text+0x2c6): undefined reference to `Keyword::Keyword()'
source.cpp:(.text+0x369): undefined reference to `Keyword::~Keyword()'
source.cpp:(.text+0x4a8): undefined reference to `Keyword::~Keyword()'
source.o: In function `Keyword::put_site(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
source.cpp:(.text._ZN7Keyword8put_siteESs[Keyword::put_site(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)]+0x2a): undefined reference to `Stack<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::Push(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: ld returned 1 exit status
make: *** [tema3] Error 1
6
sniperu

この行はあなたが思うことをしません:

Keyword aux();

functionauxと呼ばれ、引数をとらずにKeywordを返すことを宣言しています。あなたはおそらく(括弧なしで)書くつもりでした:

Keyword aux;

これは、タイプKeywordの-​​objectを宣言します。

更新:

次に発生するエラーに関しては、クラスのコンストラクタとデストラクタのdeclarationがありますが、definitionがないためです。実際、発生しているエラーは、コンパイラからではなく、linkerから発生しています。

コンストラクタとデストラクタの簡単な定義を提供するには、次のように変更します。

Keyword();
~Keyword();

これに:

Keyword() { }
~Keyword() { }

または、これらのメンバー関数が何もしない限り、それらをまったく省略します-コンパイラーがそれらを生成します(コンストラクターに関係する他のユーザー宣言コンストラクターを追加しない限り)。

17
Andy Prowl

これではない

_Keyword aux();
aux.put_tag(Word);
aux.put_site(site);
_

しかしこれは

_Keyword aux;
aux.put_tag(Word);
aux.put_site(site);
_

お使いのバージョンでは、Keyword aux();関数プロトタイプ変数宣言ではありません。

3
john

Main関数に次のコードを入力したときに同じ問題が発生しました。List.hがあり、List.cppファイルにListクラスが含まれています。

List<int,int> myList();
bool x=myList.isEmpty();

「クラスタイプ以外の「List()」である「myList」のメンバー「isEmpty」のリクエスト」というエラーが表示されます。

エラーは、コンパイラがmyList()を関数プロトタイプと見なすためです。

コードを次のように修正すると

List<int,int> myList;
bool x=myList.isEmpty();

「 `List :: List()への未定義の参照」というエラーと、デストラクタに関する同様のエラーがいくつか発生しました。

このページのコードと回答をさらに調べると、main.cppにList.cppファイルを含める必要があることがわかりましたが、List.cppファイルにList.hを含めましたが、この情報を次のように伝える必要があるようです。メインファイルも同様です。 このチュートリアル の詳細を読む理由を説明します。List.cppをインクルードせずにプロジェクトをコンパイルすると、List.hファイルにプロトタイプがあるため正常にコンパイルされますが、リンカーが失敗するため、リンカー段階で失敗します。 List()の呼び出しを特定の関数に解決できません。

0
newComer