将std :: cin传递给参数时将istream转换为ifstream的问题

时间:2018-04-16 21:13:48

标签: c++ pass-by-reference ifstream pass-by-value istream

我目前正在实施一个基于文本文件的测试用户界面,它将从文本文件(逐行)中模拟用户输入,以模拟真实的用户输入,而不是使用std::cin

当我尝试将std::cin传递到std::ifstream参数时出现问题;无论是通过引用还是通过价值,问题仍然存在。

功能:

void ZoinkersEngine::displayMainMenu(User& currentUser, std::ifstream& in) {
//need a function to check the role level of the user here

//DEMO (Mock-up) of Menu
std::string option = "";
do {
    std::cout << std::string(40, '\n');
    std::cout << "Successfully logged in...\n\n\n";
    std::cout << "Main Menu:\n";
    std::cout << "[0] Order Plan\n";
    std::cout << "[1] Generate Plan\n\n";

    std::cout << "Please input number of selected option: ";
    // std::cin >> option;
    in >> option;

    if (option == "0") {
        currentUser.calculateExhibitFav(zoinkersDirectory);
        currentUser.orderPlan(zoinkersDirectory);
    }
    else if (option == "1") {
        currentUser.calculateExhibitFav(zoinkersDirectory);
        currentUser.generatePlan(zoinkersDirectory);
    }
    else if (option == "cancel" || option == "Cancel") {
        break;
    }
} while (option != "cancel" || option != "Cancel");}

致电功能:

engine.displayMainMenu(currentUser, std::cin);

错误:

cannot convert argument 2 from 'std::istream' to 'std::ifstream'

我无法弄清楚这一点;据我所知ifstream派生自istream基类,因此编译器应该能够投射它。

编辑#1:当前的IDE是Visual Studios 2017;答案还必须在g ++上编译并在linux上工作。

1 个答案:

答案 0 :(得分:2)

没有隐含的向下投射。如果您希望函数采用输入流,那么它应该具有签名

void ZoinkersEngine::displayMainMenu(User& currentUser, std::istream& in)
                                                             ^      ^
                                                             |      reference here
                                                             istream, not ifstream

现在,您可以将任何流istream或派生自一个流传递给它。

这是必要的

  1. 如果由于流不可复制而是左值,则无法按值传递流
  2. 只能在基类最初是派生类时才能从基类转换为派生类。这也只能通过指针完成,否则派生到基类转换将slice并且您将丢失派生类部分