2014-10-27 52 views
0

Win7的64位误差可以标记错误的位置

cygwin的克++ 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) { } 
              ^
+0

可能是一个很好的问题,请做一个完整的测试用例 - 提供一个main() – 2014-10-27 21:40:40

+0

问题是,为什么“str(str)”有一个当“istream in”存在时出错,不存在时不出错?我并不十分关心“istream in”,因为(我认为)那是我的问题,而且我造成了错误。 – 2014-10-28 03:40:16

回答

2

的错误是istream没有缺省构造的,但你想默认构造它。有一个protected默认构造函数 - 可能用于某些其他类 - 但是您不允许使用它。你被允许使用的只有一个:

explicit istream(streambuf*); 

但有与此构造另外一个问题:你是构建你的str为临时str的引用InputClass接受。所以一旦构造函数完成,你就留下一个悬而未决的参考。您需要通过参考而不是按价值接受来源vector

0

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

+0

谢谢。我想到了(我正在使用ifstream),但感谢您的努力。 – 2014-10-28 03:39:51

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;成员。 There's no default constructor available for std::istream


可以有例如一个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