1. ホーム
  2. c++

Crazy c++ error: ... ... which is non-class type...

2022-02-14 08:48:51
<パス

コードは以下の通りです。

//sqlite_interface.h
class SqlteOp {
    private:
        sqlite3 *db;

    public:
        SqlteOp(string dbname);
        ~SqliteOp();
        void print();
}

//sqlite_interface.cpp
SqliteOp::SqliteOp(string dbname)
{
    cout<<"db name is: "<<<dbname<<endl;
    sqlite3_open(dbname.c_str(), &db);
    ...
}

SqliteOp::print()
{
    cout<<"Sqlite Operation print function"<<<endl;
    ...
}
SqliteOp::~SqliteOp()
{
    cout<<"destroy sqlite op object"<<<endl;
    sqlite3_close(db);
}

//main.cpp
int main(int argc, char **argv)
{
    SqliteOp sqliteOp(string(argv[1]));
    sqliteOp.print();
    return 0;
}

//compile
dk@dkos:~ g++ --std=c++11 main.cpp sqlinteop.cpp -I /usr/local/include -L /usr/local/lib -lsqlite3 -lpthread -ldl

// error reporting
main.cp:14:13: error: request for member 'print' in 'sqliteOp', which is of non-class type .......

むかつく、とてもむかつく、このエラーはおかしすぎる、言語を使いづらくしている、コンパイルやデバッグのコストが大きすぎる.私は言葉を失いました、解決策を見てください、g++の投稿をclang++に置き換えてコンパイルしてみてください(なぜclangを使うのか、clangはより良いエラーメッセージを表示できるからです)、特定のヒントを参照してください。

dk@dkos:~ clang++ --std=c++11 main.cpp sqlinteop.cpp -I /usr/local/include -L /usr/local/lib -lsqlite3 -lpthread -ldl
// The prompt is as follows
main.cpp:14:23: note: add a pair of parentheses to declare a variable
     SqliteOp sqliteOp(string(argv[1]));
                       ^
                       ( )


ヒントに従って追加したところ、うまくコンパイルできました。おそらく、コンパイラはこの定義をクラス定義としてではなく、関数宣言として扱っているのでしょう。

同じような問題を後でググってみたら、他の人もヒットしていましたが、その人は次のリンクでもう少し分かりやすく説明していました。
http://dehun.bitbucket.org/articles/23_oct_2013-Error%20which%20is%20of%20non-class%20type.html