2012-08-02 82 views
0

嗨,我有一些代碼,我正在寫一個.obj模型解析器的麻煩。 下面是造成問題的代碼:錯誤,當使用std :: copy

std::istringstream iss(line.substr(1)); 

std::copy( 
std::istream_iterator<float>(iss),  
std::istream_iterator<float>(),  
std::back_inserter<std::vector<float>>(model.chunks.back().vectices) 
); 

它基本上採取的是這樣一個參數傳遞的字符串:

v -5.000000 -1.000000 1.000000

然後得到子從它只剩下這個:

-5.000000 -1.0 00000 1.000000

最後,我使用std ::副本,並從字符串內獲取每個組數字:

頂點[0] = -5.000000
頂點[1] = -1.000000
頂點[2] = 1.000000

反正這裏的主要問題是,我是從下面這行代碼得到一個錯誤:

std::back_inserter<std::vector<float>>(model.chunks.back().vectices)); 

它說「預期令牌」;「得到浮動「我的代碼仍然編譯和運行的完美無瑕。

雖然如果我用std :: string替換那個代碼中的浮點數,我不會再出錯了。

std::copy( 
std::istream_iterator<std::string>(iss), 
std::istream_iterator<std::string>(), 
std::back_inserter<std::vector<std::string>>(model.chunks.back().vectices) 
); 

我正在使用Qt Creator,所以這可能只是一個IDE錯誤?任何幫助將不勝感激!

+0

std :: back_inserter可以從參數中推導出類型。 – ForEveR 2012-08-02 04:39:06

+1

你爲什麼不只是寫'的std :: back_inserter(model.chunks.back()。vectices)',讓編譯器推斷出類型參數? – Nawaz 2012-08-02 04:59:22

+0

嗯..沒有想到這一點。它也需要更少的代碼。謝謝你的提示! – luveti 2012-08-02 05:05:39

回答

4

這可能是你的IDE不理解你的模板規範的>>。較早版本的C++標準要求您在> >之間的每個>之間放置一個空格,否則可能會與右移操作符>>混淆。所以:

std::back_inserter<std::vector<float> >(model.chunks.back().vectices)); 
+1

好的理論,但他說它可以在代碼的最後一節中使用'std :: string',它包含沒有空格的相同'>>'序列。 – 2012-08-02 04:42:24

+0

啊,沒錯。好奇。但肯定這是一個特定於IDE的事情,因爲否則語法錯誤的代碼不能「完美地編譯和運行」。 – 2012-08-02 04:42:43

+0

只是在>>和錯誤之間增加了一個空格就消失了!必須是IDE。謝謝你們,謝謝你這麼快回復! – luveti 2012-08-02 05:02:51