【问题标题】:How to call the function that accepts std::istream&如何调用接受 std::istream& 的函数
【发布时间】:2023-03-16 01:50:02
【问题描述】:

我是 C++ 的初学者。调用期望 std::istream& 的函数的正确方法是什么?

read(std::cin); 尝试过,但编译器出错。

typedef double Element;

template<typename T>
std::list<T> read(std::istream& i) {  
  Element input;
  std::list<Element> l;
  while(i>>input) {
   l.push_back(input);
  }
  return l;
}

【问题讨论】:

  • 你的编译器的错误是什么,究竟是什么?调用这个函数的代码到底是什么?无论如何,它可能与std::istream 无关,但与模板参数在这里不可推导的事实有关,但不能在没有看到代码的情况下确定。在 stackoverflow.com 上发布他们的第一个问题之前,每个人都应该采取tour,阅读help center,了解minimal reproducible exampleHow to Ask 问题的所有要求。几乎每次都不做这些都会导致质量差的问题。然后它被否决、关闭,然后被删除。
  • 你遇到了什么错误?
  • no matching function for call to 'read' 是我得到的错误
  • 错误消息继续:note: candidate template ignored: couldn't infer template argument 'T'。当您编写 read(std::cin) 时,编译器应该用什么替代 T
  • 替代解决方案:template&lt;typename T = Element&gt;。但无论如何,你不应该在read() 中混用ElementT。它应该是Element(然后read() 将成为常规函数)或T(然后它应该是std::list&lt;T&gt; l;)。

标签: c++ list input istream


【解决方案1】:

这与std::istream&amp;参数无关。

问题在于该函数是一个函数模板,它需要一个显式模板参数来确定应该从流中读取的类型,例如:

read<int>(std::cin)

编译器的错误信息也应该告诉你类似的事情。

除此之外,您没有在函数中使用T。可能您想用T 替换Element 的所有用法并删除typedef

【讨论】:

    【解决方案2】:

    你只是有一个小的语法错误:

    试试这个代码:

    typedef double Element;
    class test{
    
    public:
    auto read(std::istream& i){
    
    Element input;
    std::list<Element> l;
    while(i>>input){
     l.push_back(input);
    }
    return l;
    }
    
    
    };
    
    
    int main(){
    test t;
    t.read(std::cin);
    
    return 0;
    }
    

    【讨论】:

    • OP 有template&lt;typename T&gt;,但你没有
    • 而且把一个函数放到一个类里也没多大意义。
    • 他可以有一个包含许多成员函数的类,他会问一个关于一个函数的问题。这并不意味着我告诉他使用一个类,您可以将 auto 替换为 std::list ok。 @justANewbie
    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 2013-08-28
    • 2022-07-27
    • 2017-02-25
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多