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) { }
^
答案 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