c++ -错误:在'{'标记之前期望的类名

C++ - error: expected class-name before ‘{’ token

本文关键字:期望 错误 c++      更新时间:2023-10-16

我在编译这个类时遇到了麻烦。我试图继承StoreQueryResult对象,该对象持有MySQL查询的结果/行,以便为数组下标操作符

应用一些自定义异常处理机制

代码

/* MySQLQueryResult.h */

#ifndef MYSQLQUERYRESULT_H
#define MYSQLQUERYRESULT_H
#include <mysql++.h>
#include <result.h>
namespace  MinesScanner {
    namespace MoonStone {
        class MySQLQueryResult : protected StoreQueryResult {
        public:
            MySQLQueryResult();

            MySQLQueryResult(const MySQLQueryResult &other);
            MySQLQueryResult& operator=(const MySQLQueryResult &other);
            MySQLQueryResult& operator[](int index);
        private:
            double empty_val = 0.0;

        };
    }
}
#endif  /* MYSQLQUERYRESULT_H */

和相应的源文件

/* MySQLQueryResult.cpp */
#include "MySQLQueryResult.h"
namespace MinesScanner {
    namespace MoonStone {
        MySQLQueryResult::MySQLQueryResult( )
        {
            StoreQueryResult( ) ;
        }
        MySQLQueryResult::MySQLQueryResult( const MySQLQueryResult &ob )
        {
            StoreQueryResult( const StoreQueryResult & ob ) ;
        }
        MySQLQueryResult& MySQLQueryResult::operator=( const StoreQueryResult &ob )
        {
            StoreQueryResult::operator=( ob ) ;
            return *this ;
        }
        MySQLQueryResult& MySQLQueryResult::operator[]( int index )
        {
            try {
                Row *val = ( *this ).at( index ) ;
                return *val ;
            } catch ( std::out_of_range& excpn_ob ) {
                return *empty_val ;
            }
        }
    }
}

gcc在编译

时报告此错误
./MySQLQueryResult.h:20:61: error: expected class-name before ‘{’ token
./MySQLQueryResult.cpp: In constructor ‘MinesScanner::MoonStone::MySQLQueryResult::MySQLQueryResult()’:
./MySQLQueryResult.cpp:16:22: error: ‘StoreQueryResult’ was not declared in this scope

下面是make文件

中的行
CXX := g++ 
CXXFLAGS := -Wall -g -std=c++11 -I/usr/bin/include/mysql++ -I/usr/include/mysql  
LDFLAGS := -L/usr/lib64 -lmysqlpp -lnsl -lz -lm -L/usr/lib64/mysql  -lmysqlclient -lboost_date_time
EXECUTABLE := main
mysqlqueryresult.o : ./Moon_Stone_Scanner/MySQLQueryResult.cpp
    ${CXX} -c ${CXXFLAGS} ${LDFLAGS} ./Moon_Stone_Scanner/MySQLQueryResult.cpp
main.o:  main.cpp
    ${CXX} -c ${CXXFLAGS} ${LDFLAGS} mysqlqueryresult.o main.cpp

因此,到目前为止,我可以看到mysql++.h被包括在错误发生的行之前,并且在编译期间也包括在内,但我仍然得到那个说error: expected class-name before ‘{’ token的错误。请告诉我哪里错了。

那么,有几件事。

  • StoreQueryResultmysqlpp命名空间中。这意味着您需要添加这个名称空间说明符(通过using namespace mysqlpp或以mysqlpp::作为前缀)。前者应该只在.cpp文件中完成。因此,将protected StoreQueryResult更改为protected mysqlpp::StoreQueryResult

  • 在cpp文件中,添加:using namespace mysqlpp;(就在顶部的include指令之后)。

  • 调用基构造函数时,而不是:

    MySQLQueryResult::MySQLQueryResult( )
    {
        StoreQueryResult( ) ;
    }
    MySQLQueryResult::MySQLQueryResult( const MySQLQueryResult &ob )
    {
        StoreQueryResult( const StoreQueryResult & ob ) ;
    }
    

    :

    MySQLQueryResult::MySQLQueryResult( )
      : StoreQueryResult()
    {
    }
    MySQLQueryResult::MySQLQueryResult( const MySQLQueryResult &ob )
      : StoreQueryResult( ob )
    {
    }
    
  • 您的MySQLQueryResult& MySQLQueryResult::operator=( const StoreQueryResult &ob )在头文件中丢失。添加这个:

    MySQLQueryResult& operator=(const mysqlpp::StoreQueryResult &ob);
    
  • 你的[]操作符在我看来很可疑。empty_val在我所知的任何地方都没有定义


可能与您的设置无关,但我也不得不将-I/usr/include/mysql++添加到makefile中。

StoreQueryResult更改为mysqlpp::StoreQueryResult。命名空间为mysqlpp