2016-09-17 17 views
0

我使用了一大段代碼,它在gcc> = 4.7的Windows和Linux中編譯。這是一個實用工具,可以在Matlab中從某人編寫的m腳本中無縫生成mex函數。我在編譯Mac OS x中的短c腳本(這裏沒有提供)時遇到了問題。我在C++ 11中使用gcc-4.8。它僅將Boost庫用於標頭。它卡住了一塊實用的代碼是:'value'不是boost :: mpl :: aux :: wrapped_type的成員......當創建mex函數時

/* gets mxClassID, given C type> 
    eg. mx_class_id<float>()*/ 
template<typename T> 
struct mx_class_id 
{ 
    operator mxClassID() 
    { 
     return static_cast<mxClassID>(boost::mpl::at<mxInverseTypeMap,T>::type::value); 
    } 
}; 

要求

template<typename T> 
mxArray* mxCreateScalar(const T & val) 
{ 
    //mxClassID cid=static_cast<mxClassID>(boost::mpl::at<mxInverseTypeMap,T>::type::value); 
    mxArray * arr=mxCreateNumericMatrix(1,1,mx_class_id<T>(),mxREAL); 
    mxSetValue(arr,val); 
    return arr; 
} 

我缺少什麼?它與內置的clang庫衝突嗎?或者它是一個未指定的頭文件(包含boost/mpl/at.hpp)?正如我提到它在Windows和Linux的Matlab編譯。我已經嘗試提高1.51.0(這是我們使用),也是1.56.0(這是Matlab使用),但我得到相同的錯誤信息。 我用它來編譯代碼是

mex -v /usr/local/bin/gcc-4.8 -I path-to-boost-library -I path-to-private-library -I /usr/local/lib -std=C++11 script.cc 

以下是錯誤消息我得到:

error: 'value' is not a member of 'boost::mpl::aux::wrapped_type < boost::mpl::aux::type_wrapper < mpl_::void_> > ::type {aka mpl_::void_}'

任何指針或幫助表示讚賞。謝謝

+0

我不知道是否可以用你提供的信息來回答,但是如果我不得不猜測,我會說問題是類型'T'不包含在類型序列'mxInverseTypeMap'中。 – llonesmiz

+0

mx_class_id ::運算符mxClassID()[with T = long unsigned int]'和mxCreateScalar(const T&)[with T = long unsigned int; mxArray = mxArray_tag]'。我們使用boost/cstdint.hpp – gujax

+0

我不太確定,但[this](http://es.mathworks.com/help/matlab/apiref/mxclassid.html#bqvsjjl-4)似乎是翻譯表在C/C++類型和matlab之間。是否有可能無論你使用的類型是在windows和linux中使用'unsigned long long'的typedef和在mac中使用'unsigned long'(這在表中似乎是缺少的)?你可以嘗試另一個編譯器(例如clang)?對不起,我猜你解決了這個問題。 – llonesmiz

回答

0

這是通過'size_t'和'unsigned long int'的衝突使用來解決的。 我認爲在Linux中,Windows,size_t被用在代碼中,假設它是uint64_t。它在兩個編譯。

但是,對於mac os x,它是size_type或unsigned long int。這是由於代碼將c類型與Matlab mex類型與一對一映射相匹配而造成的特別的問題。在逆映射中,通過使用size_t,這個一對一映射漸漸消失,而變成了多對一映射。一旦解決了這個問題,很容易解決其餘的問題。

相關問題