轉(zhuǎn):http://www.cnblogs.com/rocketfan/archive/2010/12/29/1920943.html
最近用boost::math庫(kù)趾娃,發(fā)現(xiàn)會(huì)和我以前的程序沖突。比如我的程序如果用到
#include 等等std::tr1名字域下的東西。富弦。。
google了下氛驮,原因是boost::tr1設(shè)計(jì)初衷是為了在你的系統(tǒng)沒(méi)有std::tr1標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)的情況下讓你仍然可以在程序中使用std::tr1::unordered_map, std::tr1::tuple等東東腕柜,當(dāng)然了這是一個(gè)work around,也就是你其實(shí)還是用的boost::tuple等等
只是你的代碼寫的時(shí)候可以寫std::tr1::tuple。
比如boost的math庫(kù)的一個(gè)分布函數(shù)的實(shí)現(xiàn)
/usr/include/boost/math/special_functions/detail/igamma_inverse.hpp
在該文件第13行
#include
然后下面它就用到了tuple使用如下
std::tr1::tupleoperator() (constT& x) const? //其實(shí)呢還是用的boost::下面的tuple
看下/usr/include/boost/tr1/tuple.hpp
namespacestd{namespacetr1{using::boost::fusion::tuple;// [6.1.3.2] Tuple creation functionsusing::boost::fusion::ignore;using::boost::fusion::make_tuple;using::boost::fusion::tie;using::boost::fusion::get;// [6.1.3.3] Tuple helper classesusing::boost::fusion::tuple_size;using::boost::fusion::tuple_element; }}
這就是work around的方法矫废。
現(xiàn)在問(wèn)題來(lái)了盏缤,我的GCC已經(jīng)有std::tr1的實(shí)現(xiàn)了,比如 ,那么著就會(huì)帶來(lái)命名沖突了蓖扑,比如同時(shí)又兩個(gè)tuple定義了唉铜。。律杠。潭流。boost::fusion::tuple和原生的std::tr1::tuple竞惋。
見(jiàn)boost::tr1的文檔
實(shí)現(xiàn)
如果 Boost.TR1被配置為使用你的標(biāo)準(zhǔn)庫(kù)中的原生 TR1 實(shí)現(xiàn),則它不需要做多少事情:它只是包含適當(dāng)?shù)念^文件就行了灰嫉。
如果 Boost.TR1 使用了某個(gè)組件的 Boost 實(shí)現(xiàn)拆宛,則它需要包含適當(dāng)?shù)?Boost 頭文件并使用聲明將所需的名字導(dǎo)入到namespace std::tr1中。注意讼撒,只有作為標(biāo)準(zhǔn)部分的聲明會(huì)被導(dǎo)入:本實(shí)現(xiàn)有意非常嚴(yán)格地沒(méi)有將所有 Boost-特有的擴(kuò)展引入到namespace std::tr1浑厚,這是為了能夠捕獲用戶代碼中的任何可移植性錯(cuò)誤。如果你真的需要使用 Boost-特有的擴(kuò)展根盒,則你應(yīng)當(dāng)直接包含 Boost 頭文件钳幅,則改用namespace boost::中的聲明。注意炎滞,本實(shí)現(xiàn)的風(fēng)格并不是完全符合標(biāo)準(zhǔn)的敢艰,它不能將用戶自定義的 TR1 組件的模板特化增加到namespace std::tr1中。還有一到兩個(gè) Boost 庫(kù)尚未完全符合標(biāo)準(zhǔn)册赛,任何與標(biāo)準(zhǔn)不符的地方都已在"TR1 的分類"一節(jié)中說(shuō)明盖矫。不過(guò)幸好,這些不符合標(biāo)準(zhǔn)的行為在實(shí)際中極少會(huì)用到击奶。
如果你使用標(biāo)準(zhǔn)的頭文件包含(在boost/tr1/tr1中)辈双,則這些頭文件名有時(shí)可能與現(xiàn)有的標(biāo)準(zhǔn)庫(kù)頭文件沖突(例如shared_ptr已增加到現(xiàn)有的標(biāo)準(zhǔn)庫(kù)頭文件中而不是它自己的頭文件)。這些頭文件可以用以下兩種方法之一前轉(zhuǎn)到現(xiàn)有的標(biāo)準(zhǔn)庫(kù)頭文件:對(duì)于 gcc柜砾,使用#include_next, 而對(duì)于其它編譯器則使用宏BOOST_TR1_STD_HEADER(header)(在boost/tr1/detail/config.hpp中定義)湃望,它將擴(kuò)展為#include <../include/header>. 對(duì)于大多數(shù)編譯器,這樣就可以直接使用痰驱,但是這意味著這些頭文件不能被放在名為"include"且已在你的編譯器搜索路徑中的目錄下证芭。
怎么解決沖突問(wèn)題呢,還是沒(méi)有完全弄明白担映,不過(guò)解決辦法還是google到了废士。。 OK 解決了就好蝇完。官硝。 以后再說(shuō)。
按理說(shuō)按照boost/tr1/tuple.hpp? 中所寫的
#ifdef BOOST_HAS_TR1_TUPLE#? ifdef BOOST_HAS_INCLUDE_NEXT#? ? include_next BOOST_TR1_HEADER(tuple)#else#? ? include #? ? include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(tuple))#? endif
我應(yīng)該加一個(gè) #define BOOST_HAS_tR1_TUPLE 就能解決問(wèn)題 因?yàn)?BOOST_TR1_HEADER(tuple)? 會(huì)被轉(zhuǎn)換為#include
但是實(shí)驗(yàn)不成功短蜕。氢架。。朋魔。
usr/include/boost/tr1/tuple.hpp:13:43: error: no include path in which to search for tr1/tuple? //WHY 知道為什么的幫忙告訴我下岖研,謝謝~
//估計(jì)可能是incude_next的原因? 沒(méi)太仔細(xì)看include_next作用TODO
最后google到的解決方案是
#defineBOOST_HAS_TR1_TUPLE 1#include #undefBOOST_HAS_INCLUDE_NEXT? //似乎是需要屏蔽掉 incude_next
好吧 暫時(shí)和平了 費(fèi)了我好多時(shí)間 希望后面誰(shuí)也碰到這種情況的問(wèn)題能節(jié)省下時(shí)間:)