2011-04-23 95 views
1

刚接触C++,需要帮助解决一个错误。 下面的代码在较旧的Sun版本(CC 5.3和5.8)上编译得很好。 我在发生错误的行上发表评论。 任何援助将不胜感激。 非常感谢。 -RW初始化一个对象时发生C++编译错误

Unix版:SunOS的ut51278 5.10 Generic_141444-09 sun4u的SPARC SUNW,SPARC-企业
编译器版本:CC:孙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); 

}; 

错误是在database.cpp存在的......看到错误messag评论È....

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; 
} 

回答

1

变化:

DBSql(DBSql& dbSql); 

到:

DBSql(DBSql const & dbSql); 

调用Table(string(tableName))会产生一个临时文件,需要使用复制构造函数进行复制才能返回。由于该值是暂时的,因此您只能获得对其的引用 - 而您的副本构造函数不接受该值。

因为你的拷贝构造函数和赋值操作符实际上并不是做的什么,所以你可以把它们排除在外。如果保留它们,则还应该更改DBSql& operator=(DBSql& dbSql);以接受const引用 - DBSql& operator=(DBSql const & dbSql); - 并在父类复制构造函数和赋值运算符中进行相同的更改。