我使用了一大段代碼,它在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_}'
任何指針或幫助表示讚賞。謝謝
我不知道是否可以用你提供的信息來回答,但是如果我不得不猜測,我會說問題是類型'T'不包含在類型序列'mxInverseTypeMap'中。 – llonesmiz
mx_class_id ::運算符mxClassID()[with T = long unsigned int]'和mxCreateScalar(const T&)[with T = long unsigned int; mxArray = mxArray_tag]'。我們使用boost/cstdint.hpp –
gujax
我不太確定,但[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