[英]Error: reference to ‘sword’ is ambiguous in armadillo and oracle occi compatibility issue
在犰狳C ++中,我使用一些api並使用oracle occi嘗試將值插入到oracle表中,但出現如下錯誤:
/home/oracle/Desktop/project/armadillo-4.450.4/include/armadillo_bits/typedef_elem.hpp:79: error: typedef arma::s32 arma::sword
/usr/include/oracle/11.1/client/ociap.h:10830: error: reference to ‘sword’ is ambiguous
/usr/include/oracle/11.1/client/oratypes.h:227: error: candidates are: typedef int sword
我的示例代碼是:-main.cpp
#include <stdio.h>
#include <iostream>
#include "db_manager.h"
#include <armadillo>
using namespace arma;
int glbsize;//this variable is global it is declared in global_variables.h
mat glbmtrx;//this variable is global it is declared in global_variables.h
void add()
{
double deter;
int ppp=0;
mat z;
mat x = randu<mat>(4,4);
mat y = randu<mat>(4,4);
z=x+y;
mystruct strct;
strct.mymatrix=z;//variable from comm.structure
glbmtrx=strct.mymatrix;//varible from glb.variables
deter= det(z);
db_manager db;
db.load_determinant(deter);
}
int main()
{
add();
return 0;
}
db_manager.cpp
#include "db_manager.h"
#include <sstream>
#include <iostream>
#include <sstream>
#include <fstream>
using namespace oracle::occi;
using namespace std;
Environment *env;
Connection *con;
void db_manager::load_determinant(double det)
{
mystruct strct;
strct.deter_size=det;//var from comm.structure
string user = "user";
string passwd = "p@$$word";
string db = "localhost:1521/sisdba";
env = Environment::createEnvironment((Environment::Mode)(Environment::OBJECT|Environment::THREADED_MUTEXED));
con = env->createConnection(user, passwd, db);
Statement *stmt = NULL;
ResultSet *rs = NULL;
string concat1="";
concat1=static_cast<ostringstream*>(&(ostringstream()<<det))->str();
string sql="insert into determinanit_table values('"+concat1+"')";
stmt = con->createStatement(sql);
stmt->executeUpdate(sql);
env->terminateConnection (con);
Environment::terminateEnvironment (env);
}
db_manager.h
#include "includes/global_variables.h"
#include <occi.h>
class db_manager
{
public:
db_manager(void);
~db_manager(void);
void load_determinant(double det);
};
common_struct.h
#include <armadillo>
using namespace arma;
using namespace std;
struct mystruct
{
mat mymatrix;
double deter_size;
};
global_variable.h
#include "../includes/common_structures.h"
using namespace arma;
extern int glbsize;
extern mat glbmtrx;
Makefile文件:
excute:main.o db_manager.o
g++ -o excute main.o db_manager.o \
-I/home/oracle/Desktop/sum_result/armadillo-4.450.4/include -DARMA_USE_BLAS -DARMA_USE_LAPACK -DARMA_DONT_USE_WRAPPER -lblas -llapack \
-I/usr/include/oracle/11.1/client \
-L$(ORACLE_HOME)/lib -lclntsh -locci
%.o: %.cpp
g++ -c -o $@ $< -ggdb \
-I/home/oracle/Desktop/sum_result/armadillo-4.450.4/include -DARMA_USE_BLAS -DARMA_USE_LAPACK -DARMA_DONT_USE_WRAPPER -lblas -llapack \
-I/usr/include/oracle/11.1/client \
-L$(ORACLE_HOME)/lib -lclntsh -locci
clean:
rm *.o excute
對您的代碼的一些注釋:
mat glbmtrx;
在main.cpp
)。 如果庫犰狳也使用全局變量來工作,則無法保證所有全局變量的分配順序。 如果將變量glbmtrx
分配給mat
的構造函數使用的全局變量之前,那么您將遇到問題! 如果您確實需要,最好使用Singleton Pattern 。 common_struct.h
:永遠不會調用using
一個頭文件! 您可以在命名空間之間創建沖突。 想象一下,我想合並您的應用程序和我的應用程序。 如果我在應用程序中使用了一個名為vector
的類,則由於您的文件中vector
引用了std::vector
的事實,調用它不會產生沖突。 using namespace std
進行調用,而應始終將其添加到您調用的類/函數中。 當我一起使用多個庫時,我從不using namespace xxx
調用,而我始終使用全局名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.