[解決済み] エラー C2228: '.size' の左側にはクラス/構造体/ユニオンが必要です。
2022-02-07 10:52:37
質問
vectorの "S "を呼び出すと、次のようなコンパイラエラーが発生します。
size()
. なぜですか?
#include <vector>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cassert>
using namespace std;
class Vertex {
float firstValue;
float secondValue;
float thirdValue;
Vertex (float first, float second, float third){
firstValue=first;
secondValue=second;
thirdValue=third;
}
};
int main()
{
cout<<"This program loads a 3D .off object. \nEnter the name of the file that describes it "<<endl;
string inputFileName;
getline(cin, inputFileName);
ifstream inputFileStream;
inputFileStream.open(inputFileName.data());
assert (inputFileStream.is_open());
string actualLine;
for(;;){
inputFileStream>>actualLine;
istringstream actualLineStream(actualLine);
std::vector<float> results( std::istream_iterator<int>(actualLineStream)
, std::istream_iterator<int>() );
int resultsIndex=0;
int resultsSize=results.size(); //WHY??
while (resultsIndex<resultsSize){
cout<<results[resultsIndex]<<endl;
}
if (inputFileStream.eof()) break;
}
ofstream outputChannel;
while (true){} // to keep on console view
return 0;
}
解決方法は?
信じられないかもしれませんが、この行は
ではありません。
のインスタンスを宣言しています。
std::vector
という名前の
results
で、beginとendのイテレータをとってコンストラクタを呼び出す。
std::vector<float> results(std::istream_iterator<int>(actualLineStream),
std::istream_iterator<int>());
これは実際に
は関数を宣言しています。
という
results
というパラメータを受け取り、そのパラメータは
actualLineStream
と別の無名パラメータがあり、どちらも型は
std::istream_iterator<int>
.
一般にC++では、何かが関数のように見える場合、それは関数のように解析されます。これはCとの後方互換性のためなのですが、あまりにも直感的であるため、これには独自の名前がついています。 最も厄介な構文解析。 . コンパイラによっては、最も厄介な構文解析に遭遇すると警告を発するものもあります。
この2行がC++で等価でないことと関係がある。
Foo bar; // Declares an instance of Foo named bar
Foo bar(); // Declares a function named bar that takes no parameters and returns a Foo
これを修正するには、引数の1つの周りにさらに括弧を追加します。
// +--------- Note extra parentheses!! ---------+
// | |
// V V
std::vector<float> results((std::istream_iterator<int>(actualLineStream)),
std::istream_iterator<int>());
あるいは、単純に各イテレータを別々に宣言する。
std::istream_iterator<int> resultsBegin(actualLineStream);
std::istream_iterator<int> resultsEnd;
std::vector<float> results(resultsBegin, resultsEnd);
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み】エラー。C2228: ''の左側には class/struct/union が必要です。
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない