考慮這個例子:矢量構造函數有兩個參數被解析爲函數聲明
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
int main()
{
std::string sen = "abc def ghi jkl";
std::istringstream iss(sen);
std::vector<std::string> // declaration in question
vec(std::istream_iterator<std::string>(iss),
std::istream_iterator<std::string>());
std::copy(vec.begin(), vec.end(),
std::ostream_iterator<std::string>(std::cout, "\n"));
}
編譯器會引發在調用一個錯誤std::copy
request for member 'begin' in 'vec', which is of non-class type...
我可以避開錯誤像這樣:
std::istream_iterator<std::string> it_begin(iss);
std::istream_iterator<std::string> it_end;
std::vector<std::string> vec(it_begin, it_end);
或通過將括號圍繞每個參數,如下所示:
std::vector<std::string>
vec((std::istream_iterator<std::string>(iss)),
(std::istream_iterator<std::string>()));
或即使在C++ 11新的統一初始化:
std::vector<std::string> vec { /*begin*/, /*end*/ };
爲什麼編譯器解析在該示例中作爲聲明函數聲明?我知道最令人頭痛的解析,但我認爲只發生在空的參數列表中。 我也想知道爲什麼第二種解決方法有效。
GCC 4.6.1,如果有關係。我也嘗試了comeau的在線編譯器。 – jrok
保存自己的一些輸入:'std :: istream_iterator it_begin(iss),it_end; std :: vector vec(it_begin,it_end);' –
格式良好,結構良好且格式良好的問題,符合主題和有用。做得好。 :) –