此上下文标记中的错误可能标记错误的位置

时间:2014-10-27 21:35:34

标签: c++ c++11

Win7 64位

cygwin g ++ 4.8.3(-std = gnu + 11)

我有一些代码有点问题。

class InputClass {
private:
   vector<string>& str;
   istream in;                  // no code, no error
public:
   InputClass(vector<string> str) : str(str) { }
}; // class InputClass

为什么“istream in;”产生错误,为什么“str(str)”被标记为错误。当“istream in;”被删除,没有错误。

完整的错误消息等:

g++ -Wall  -Wunused-variable -std=gnu++11   -c -g -MMD -MP -MF "build/Debug/Cygwin64-Windows/main.o.d" -o build/Debug/Cygwin64-Windows/main.o main.cpp
In file included from /usr/lib/gcc/x86_64-pc-cygwin/4.8.3/include/c++/iostream:40:0,
                 from main.cpp:9:
/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/include/c++/istream: In constructor 'InputClass::InputClass(std::vector<std::basic_string<char> >)':
/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/include/c++/istream:606:7: error: 'std::basic_istream<_CharT, _Traits>::basic_istream() [with _CharT = char; _Traits = std::char_traits<char>]' is protected
       basic_istream()
       ^
main.cpp:44:44: error: within this context
    InputClass(vector<string> str) : str(str) { }
                                            ^

3 个答案:

答案 0 :(得分:2)

错误是istream不是默认可构造的,但您正尝试默认构造它。存在protected默认构造函数 - 可能对于其他一些类 - 但是您不允许使用它。您唯一允许使用的是:

explicit istream(streambuf* );

但是这个构造函数还有另一个问题:您构建的str是对str接受的临时InputClass的引用。所以一旦构造函数完成,你就会留下一个悬空引用。您需要通过引用而不是按值接受源vector

答案 1 :(得分:0)

您必须使用缓冲区初始化istream。在您的代码中,将调用默认构造函数。

答案 2 :(得分:0)

基本错误消息是

/usr/lib/gcc/x86_64-pc-cygwin/4.8.3/include/c++/istream:606:7: error: 'std::basic_istream<_CharT, _Traits>::basic_istream() [with _CharT = char; _Traits = std::char_traits<char>]' is protected
   basic_istream()

您无法使用默认构造函数实例化istream in;成员。 std::istream的{​​{3}}。


您可以拥有例如istream& in;引用成员以及相应的构造函数:

class InputClass {
private:
    vector<string>& str;
    istream& in;
        // ^
public:
    InputClass(vector<string> str) : str(str), in(std::cin) { }
                                               // ^^^^^^^^
}; // class InputClass

或使用提到的一个可用的构造函数

class InputClass {
private:
    vector<string>& str;
    istream in;
public:
    InputClass(vector<string> str, std::streambuf* sb) 
                                // ^^^^^^^^^^^^^^^
    : str(str), in(sb) {}
           ^ // ^^^^^^
}; // class InputClass