2011-12-18 66 views
5

我想使用Boost.Filesystem庫迭代目錄。boost文件系統::路徑構造函數std :: length_error

問題是,當我嘗試實例化一個路徑對象時,我得到一個std :: length_error消息「字符串太長」與任何長度的字符串,即使例如「pippo」。

我已經嘗試了所有的這些:

string s = "pippo"; 

path p(s); 
path p(s.begin(), s.end()); 
path p(s.c_str()); 
path p("pippo"); 

我在與VC++ 10升壓預編譯的1.47版本的Windows 7。

謝謝你在前進, 盧卡

編輯

這是升壓代碼執行(path.hpp線129)

template <class Source> 
path(Source const& source, 
    typename boost::enable_if<path_traits::is_pathable< 
    typename boost::decay<Source>::type> >::type* =0) 
{ 
    path_traits::dispatch(source, m_pathname, codecvt()); 
} 

和錯誤是從(path_traits拋出.hpp line 174)

template <class U> inline 
void dispatch(const std::string& c, U& to, const codecvt_type& cvt) 
{ 
    if (c.size()) 
    convert(&*c.begin(), &*c.begin() + c.size(), to, cvt); 
} 

拋出的函數是「convert」。從調試器我看到兩個

&*c.begin() 

&*c.begin() + c.size() 

正確執行

+0

這是你正在運行的確切代碼嗎? – CharlesB 2011-12-18 16:17:51

+1

嘗試在調試器中運行,並確切地告訴我們錯誤來自哪裏(文件/行)。 – 2011-12-18 16:21:24

+0

是的,這是確切的代碼。我用拋出的線更新了帖子。感謝您的幫助 – 2011-12-18 21:00:44

回答

1

你提到的提升是預編譯的VC++ 10,但你沒有說哪你正在使用的編譯器。如果您使用的是Visual C++ Express,則需要自己編譯它。

但是,由於我即將使用boost :: filesystem,我想我會調查自己學習一下。首先,你幾乎不應該把整個Boost命名空間放到你的普通命名空間中(特別是如果你這樣做的話用std!)。像這樣發佈代碼使得它看起來像是「太多地使用命名空間」。像你似乎可以帶來災難性的後果

namespace fs = boost::filesystem; 
fs::path p(whatever); 

using boost::filesystem::path; 
using std::string; 
string foo("Hello!"); 
path p(foo); 

包括本地名字空間boost命名空間(或工作:如果你不想到處鍵入的boost ::文件系統,這樣做罰款,這是平局的運氣)。正如你注意到的那樣,殺死它的函數調用是convert() - 是否有另一個convert()函數可以取代它?

接下來,您應該啓用自動鏈接(對於此庫)。官方的Boost文檔說使用自動鏈接。 Boost人非常聰明(可能太聰明 - 與時間庫工作是一個痛苦......)它適用於Visual Studio 2010.

如果這樣不能解決問題,那麼您的預編譯Boost會使用不同的CRT(因爲轉換函數看起來在Boost庫中)。發生這種情況的原因很多,例如,VS2k10 Service Pack可能安裝在您的源代碼中,而不是您的源代碼等。

最終的解決方案是自己編譯Boost。在Windows上非常非常簡單:下載Boost源文件並解壓縮到任何目錄。然後打開命令提示符(開始 - >運行CMD.EXE),並做到:

cd\ 
cd "boost root directory" 
boostrap 
.\b2 

然後,只需等待約45分鐘,在酷睿2 2.5GHz的。它會用正確的CRT生成Boost庫。如果你仍然有問題,那麼你的編譯系統會出現更深的錯誤,比如在使用DLL CRT的時候連接到一個靜態的Boost庫(你應該將DLL Boost和DLL CRT鏈接起來)。

+0

我手動編譯並使用自動鏈接。現在,它的工作,謝謝。順便說一下,我的第一篇文章中的代碼行只是爲了舉例說明;顯然,我正在使用boost命名空間,正如你所建議的那樣。 – 2011-12-24 14:22:10

+0

@Picci對不起,我一直給大家上課風格,哈哈。我猜這在這裏有點相關。我很高興你能工作。我在多種平臺和體系結構上部署,因此它對我來說確實是有幫助的,因爲它是CRT問題。現在我知道在哪裏尋找類似的錯誤,如果我沒有保留我的二進制文件,比如GCC的主要版本。 – 2011-12-24 22:46:20

1

可能在您鏈接到項目 (發佈而不是調試版)的庫中發現可能的錯誤。例如, 。

假設您使用Visual Studio 2010並且「調試」配置處於活動狀態。 您必須鏈接boost_filesystem-VC100-MT-GD-1_49.dll

boost_filesystem:庫的基本名稱

VC100:Visual Studio的版本(VC100爲VS2010)

:多線程

gd:debug version

1_49:版本

也許你已經鏈接了沒有「gd」的庫。