RW1
RW1

Reputation: 11

c++ compile error when initializating an object

Am new to c++ and need help in resolving an error. The code below compiles fine on older Sun versions (CC 5.3 and 5.8). I put a comment at line where error is occuring. Any assistance would be greatly appreciated. Thanks so much. -RW

Unix version: SunOS ut51278 5.10 Generic_141444-09 sun4u sparc SUNW,SPARC-Enterprise
Compiler version: CC: Sun C++ 5.11 SunOS_sparc 2010/08/13

database.h:

#include <dbserver.h> 
#include <dbstoredproc.h> 
#include "dbsql.h" 

class Database : public DBServer 
{ 
        public : 
                DBSql SQL( const char* sqlCmd ); 
                DBSql SQL( const std::string& sqlCmd ); 
                DBSql Table( const char* tableName );                         
                DBSql Table( const std::string& tableName ); 
                DBStoredProc storedProc( const char* spName ); 
                DBStoredProc storedProc( const std::string& tableName ); 
}; 

dbsql.h:

 #include <string> 
#include "dbaccess.h" 
#include "dbtable.h" 

class DBSql : public DBAccess 
{ 
public: 
        DBSql(DBServer *pServer,const char *sql) ; 
        DBSql(DBServer *pServer,const std::string& sql); 
        DBSql(DBSql& dbSql); 
        DBSql& operator=(DBSql& dbSql); 
        virtual DBTable getResultSet(); 
protected: 
        DBSql(); 
        void init(DBServer *pServer,const std::string& sql); 

}; 

Error is occuring in database.cpp... see comment with error message....

database.cpp:

#include <database.h> 
#include "dbsql.h" 
using namespace std; 

DBSql Database::Table( const char* tableName ) 
{ 
     return Table( string( tableName ) );  // Error: "Cannot use DBSql to initialize DBSql."
} 
DBSql Database::Table( const string& tableName ) 
{ 
      string sqlCmd = "select * from " + tableName; 
      return SQL( sqlCmd.c_str() );   

} 
DBSql Database::SQL( const char* sqlCmd ) 
{ 
      return DBSql(this,sqlCmd);           
} 
DBSql Database::SQL( const string& sqlCmd ) 
{ 
      return SQL( sqlCmd.c_str() );        
} 
DBStoredProc Database::storedProc( const char* spName ) 
{ 
     return DBStoredProc( this, spName ); 
} 
DBStoredProc Database::storedProc( const std::string& spName ) 
{ 
    return DBStoredProc( this, spName ); 
} 

dbsql.cpp:

#include "dbsql.h" 
#include "dbcommon.h" 
using namespace std; 
using namespace ORACLE; 

DBSql::DBSql(DBServer *pServer,const char* sql) 
{ 
   init(pServer,string(sql)); 
} 
DBSql::DBSql(DBServer *pServer,const string& sql) 
{ 
   init(pServer,sql); 
} 
DBSql::DBSql(DBSql& dbSql) 
 : DBAccess(dbSql) 
{ 

} 
DBSql& DBSql::operator=(DBSql& dbSql) 
{ 
  DBAccess::assign(dbSql); 
  return *this; 
} 
DBSql::DBSql() 
{ 
} 
void DBSql::init(DBServer *pServer,const string& sql) 
{ 
   execSQL(pServer,sql.c_str()); 
} 

DBTable DBSql::getResultSet() 
{ 
DBTable result; 
  if(DBAccess::getResultSet(false)) 
  { 
  //In order to prevent DBAccess from closing the previous result set, pass false to 
  //getResultSet 
    result = DBTable(m_pStmt,m_pResultSet,true); // Pass true to DBTable to allow it       
    m_pStmt = NULL;                              //  to control the statement. 
  } 
  m_pResultSet = NULL; 
  return result; 
} 

Upvotes: 1

Views: 170

Answers (1)

Erik
Erik

Reputation: 91320

Change:

DBSql(DBSql& dbSql); 

To:

DBSql(DBSql const & dbSql); 

The call Table( string( tableName ) ) produces a temporary which needs to be copied, using a copy constructor, in order to be returned. Since the value is temporary, you can only get a const reference to it - and your copy constructor doesn't accept that.

Since your copy constructor and assignment operator don't actually do anything, you could just as well leave them out. If you keep them, you should also change DBSql& operator=(DBSql& dbSql); to take a const reference - DBSql& operator=(DBSql const & dbSql); - and make the same changes in the parent class copy construcor and assignment operator.

Upvotes: 1

Related Questions