c++ - 错误 C2228 : left of '.size' must have class/struct/union

标签 c++ visual-studio-2008

我在调用 vector 的 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 ,调用带有开始和结束迭代器的构造函数:

std::vector<float> results(std::istream_iterator<int>(actualLineStream),
    std::istream_iterator<int>());

这实际上声明了一个函数,叫做results接受一个名为 actualLineStream 的参数和另一个未命名的参数,类型均为 std::istream_iterator<int> .

一般在C++中,如果某个东西看起来像一个函数,它会被解析为一个; C++ 标准需要它。这实际上是为了向后兼容 C - 但这太违反直觉了,它甚至有自己的名字:"most vexing parse" .如果遇到最棘手的解析,一些编译器甚至会发出警告。

这与这两行在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

要修复它,您可以在其中一个参数周围添加更多括号:

//                         +--------- 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++ - 错误 C2228 : left of '.size' must have class/struct/union,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4175971/

相关文章:

c++ - BoundsChecker 显示不正确的内存泄漏消息

c++ - 错误 : passing xxx as 'this' argument of xxx discards qualifiers

c++ - 我们如何防止控制台窗口在 Visual Studio 下显示?

c++ - Box2d b2World 给我错误

c# - VS2008 : File creation fails randomly in unit testing?

visual-studio-2008 - OpenCV级联分类器教程异常

c++ - 使用 XRC 在 wxWidgets 中隐藏 sizer 及其所有内容

c++ - 当右侧是临时的时,co_return 与 co_yield

c# - "Temporarily Work Uncontrolled"能让我安全地保留 VSS 源代码控制吗?

c# - 如何在 MSI 安装程序中包含 pdb 文件以与应用程序的其余部分一起部署?