【问题标题】:c++ compiler error cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'c++ 编译器错误无法访问在类“std::basic_ios<_Elem,_Traits>”中声明的私有成员
【发布时间】:2013-09-25 01:07:37
【问题描述】:

嘿,我收到一个错误,我认为这与从阅读其他帖子中复制 ofstream 变量有关,我已尝试更改

std::ofstream outfil;

到

std::ofstream & outfil;

但我得到错误

reference value "outfil" requires an initializer

代码是:

#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
#include <cstdlib>

std::vector<double> GetValues_n(const std::vector<std::string>& src, int start, int end)
{
    std::vector<double> ret;
    for(int i = start; i <= end; ++i)
    {
        ret.push_back(std::strtod(src[i].c_str(), nullptr));
    }
    return ret;
}

std::vector<int> GetValues_c(const std::vector<std::string>& src, int start, int end)
{
    std::vector<int> ret;
    for(int i = start; i <= end; ++i)
    {
        ret.push_back(std::atoi(src[i].c_str()));
    }
    return ret;
}

std::vector<double> polycentre(const std::vector<double>&  x,const std::vector<double>&  y,size_t ID)
{
    std::vector<double> C(3, 0);
    std::vector<double> x1(x.size(),0);
    std::vector<double> y1(y.size(),0);
    size_t sizx = x.size();
    size_t sizy = y.size();
    if(sizy != sizx)
    {
        std::cerr << "polycentre inputs not equal length";
    }
    double x0 = x[0];
    double y0 = y[0];
    for(int aa = 1; aa < sizx; ++aa)
    {
        if(x[aa] < x0){x0 = x[aa];}
        if(y[aa] < y0){y0 = y[aa];}
    }
    double A = 0.0;
    double B = 0.0;
    for(size_t aa = 0; aa < sizx; ++aa)
    {
        x1[aa] = x[aa] - x0;
        y1[aa] = y[aa] - x0;
        if(aa != sizx-1)
        {
            A = A + (x1[aa]*y1[aa+1] - x1[aa+1]*y1[aa]);
            B = B + ((x1[aa]+x1[aa+1])*(x1[aa]*y1[aa-1]-x1[aa-1]*y1[aa]));
        }
        else if(aa == sizx-1)
        {
            A = A + (x1[aa] - y1[aa]);
            B = B + ((x1[aa]+1)*(x1[aa]*1-1*y1[aa]));
        }
    }
    A = A*0.5;
    C[0] = ID;
    C[1] = ((1/6/A)*B)+x0;
    C[2] = ((1/6/A)*B)+y0;
    return C;
}

template <typename T>

void PrintValues(const std::string& title, std::vector<std::vector<T>>& v, std::ofstream outfil)
{
    if(outfil.is_open())
    {
        outfil << "ID,X,Y,Z \n";
        std::cout << title << std::endl;
        for(size_t line = 0; line < v.size(); ++line)
        {
            for(size_t val = 0; val < v[line].size(); ++val)
            {
                std::cout << v[line][val] << " ";
                outfil << v[line][val] << ",";
            }
            outfil << "\n";
            std::cout << std::endl;
        }
        std::cout << std::endl;
    }
}

int main(int argc, char* argv[])
{

    std::ofstream & outfil;

    if (argc < 2)
    {
        std::cerr << argv[0] << " needs to get input file (2dm)" << std::endl;
    }

    else if (argc == 3)
    {
        outfil.open(argv[2]);
    }

    else
    {
        outfil.open(std::string(argv[1]) + ".csv");
    }

    std::vector<std::vector<std::string>> values;
    std::ifstream fin(argv[1]);

    for (std::string line; std::getline(fin, line); )
    {
        std::istringstream in(line);
        values.push_back(
                         std::vector<std::string>(std::istream_iterator<std::string>(in),
                                                  std::istream_iterator<std::string>()));
    }

    std::vector<std::vector<int>> cells;
    std::vector<std::vector<double>> nodes;

    for (size_t i = 0; i < values.size(); ++i)
    {
        if(values[i][0] == "E3T")
        {
            cells.push_back(GetValues_c(values[i], 1, 5));
        }
        else if(values[i][0] == "E4Q")
        {
            cells.push_back(GetValues_c(values[i], 1, 6));
        }
        else if(values[i][0] == "ND")
        {
            nodes.push_back(GetValues_n(values[i], 1, 4));
        }
    }

    std::vector<std::vector<double>> cell_centres;

    for (size_t aa = 0; aa < cells.size(); ++aa)
    {
        if(cells[aa].size() == 5)
        {
            std::vector<double> xs;
            xs.at(0) = nodes[cells[aa][1] - 1][1];
            xs.at(1) = nodes[cells[aa][2] - 1][1];
            xs.at(2) = nodes[cells[aa][3] - 1][1];
            std::vector<double> ys;
            ys.at(0) = nodes[cells[aa][1] - 1][2];
            ys.at(1) = nodes[cells[aa][2] - 1][2];
            ys.at(2) = nodes[cells[aa][3] - 1][2];
            cell_centres.push_back(polycentre(xs,ys,aa+1));
        }
        else if(cells[aa].size() == 6)
        {
            std::vector<double> xs;
            xs.at(0) = nodes[cells[aa][1] - 1][1];
            xs.at(1) = nodes[cells[aa][2] - 1][1];
            xs.at(2) = nodes[cells[aa][3] - 1][1];
            xs.at(3) = nodes[cells[aa][4] - 1][1];
            std::vector<double> ys;
            ys.at(0) = nodes[cells[aa][1] - 1][2];
            ys.at(1) = nodes[cells[aa][2] - 1][2];
            ys.at(2) = nodes[cells[aa][3] - 1][2];
            ys.at(3) = nodes[cells[aa][4] - 1][2];
            cell_centres.push_back(polycentre(xs,ys,aa+1));
        }
    }

    PrintValues("Cell Centres", cell_centres, outfil);
    //PrintValues("Cells", cells, outfil);
    //PrintValues("Nodes", nodes, outfil);

    return 0;
}

错误是:

1>------ Build started: Project: cell_centres_v2, Configuration: Debug Win32 ------
1>  main.cpp
1>c:\users\********\documents\visual studio 2010\projects\cell_centres_v2\cell_centres_v2\main.cpp(43): warning C4018: '<' : signed/unsigned mismatch
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\fstream(1116): error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios(176) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
1>          This diagnostic occurred in the compiler generated function 'std::basic_ofstream<_Elem,_Traits>::basic_ofstream(const std::basic_ofstream<_Elem,_Traits> &)'
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

非常感谢。

【问题讨论】:

    标签: c++ c private-members


    【解决方案1】:

    void PrintValues(const std::string&amp; title, std::vector&lt;std::vector&lt;T&gt;&gt;&amp; v, std::ofstream outfil) 接受std::ofstream 按值,即复制您传递给它的实际参数,但 fstreams 可能不 > 被复制,因此您会收到关于它拥有的私有基础的错误。

    当您认为引用是一种解决方案时,您是对的,但是您错过了应该使用它的地方。解决您的问题的正确方法是在PrintValues 中使用std::ofstream by reference,为此,只需将其声明更改为以下

    Your guess is correct, `void PrintValues(const std::string& title, std::vector<std::vector<T>>& v, std::ofstream& outfil)
    

    【讨论】:

      【解决方案2】:

      您首先需要了解引用的用途。引用就像指向另一个变量的永久指针,不能更改为引用其他变量,也不能为空。由于它不能为空,所以声明引用而不说明它所指的内容是没有意义的。

      你可以说

      std::ofstream outfile_;
      std::ofstream& outfil = outfile_;
      

      如果您仍然对参考参考感兴趣。

      【讨论】:

        【解决方案3】:

        您将 outfil 声明为对 std::ofstream 类型对象的引用,并在 main 中使用以下行:

        std::ofstream & outfil;
        

        必须在声明时初始化引用。您的解决方案是将outfil 声明为:

        std::ofstream outfil;
        

        【讨论】:

          【解决方案4】:

          引用必须在创建时进行初始化。无论如何,那里的引用似乎没有用处。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-02
            • 2014-01-10
            • 2015-09-05
            相关资源
            最近更新 更多