错误 C2248:无法访问在 class 中声明的私有成员,编译器行为异常
Error C2248: cannot access private member declared in class, compiler weird behavior
我遇到了一个奇怪的问题。我有以下 class:
#pragma once
#include <fstream>
#include "Rule.h"
#include <string>
#include <iostream>
using namespace std;
class RuleProvider
{
public:
RuleProvider(string);
bool isValid();
string getError();
bool isEOF();
virtual Rule readNext() = 0;
void set();
protected:
string _error;
string _path;
ifstream _file;
};
实现非常简单,由于某种原因无法编译,声称:
error C2248: 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream' : cannot access private member declared in class 'std::basic_ifstream<_Elem,_Traits>'
它引用我到最后一行。首先,成员甚至都不是私有的,在这个特定的抽象 class 中实际上没有成员是私有的。我就是找不到问题。
构造函数的实现如下:
RuleProvider::RuleProvider(string path) : _path(path)
{
this->_file.open(path);
}
其他函数仅使用ifstream
的内置函数,如is_open
等。
在主程序中,我初始化了一个对象,该对象通过他的构造函数初始化 RuleProvider
的许多派生 classes 并将它们(作为多态指针)推入一个向量中。这是该对象的构造函数中的代码片段:
(this->_providers).push_back(&this->_globalProvider);
for(int i = 0 ; i < orgProviderSize ; i++)
{
(this->_providers).push_back(new OrgRuleProvider(orgProviderPath[i]));
}
for(int i = 0 ; i < userProviderSize ; i++)
{
(this->_providers).push_back(new UserRuleProvider(userProviderPath[i]));
}
for(int i = 0 ; i < orgProviderSize + userProviderSize + 1 ; i++)
{
while(!((this->_providers)[i]->isEOF()))
{
this->_rules.insert((this->_providers)[i]->readNext());
}
}
这里是所有的函数声明(我在任何函数的定义中都没有提到 RuleProvider
这个词,所以我认为它是不必要的):
class GlobalRuleProvider : public RuleProvider
{
public:
GlobalRuleProvider(string);
virtual Rule readNext();
~GlobalRuleProvider(void);
};
另外 2 个 classes 完全相同,只是使用了另一个名称(以及 readNext()
的不同实现)- OrgRuleProvider
和 UserRuleProvider
.
class Rule
{
public:
Rule(string, string, string, string, string);
string getSrcIP() const;
string getDstIP() const;
string getSrcPort() const;
string getDstPort() const;
string getProtocol() const;
bool operator==(const Rule& other) const;
bool operator<(const Rule& other) const;
bool operator>(const Rule& other) const;
private:
static bool isValidIP(string);
static bool isValidPort(string);
static bool isValidProtocol(string);
string _srcIP;
string _srcPort;
string _dstIP;
string _dstPort;
string _protocol;
};
这是构造函数如上的通用对象:
class PacketFilter
{
public:
PacketFilter(string, string*, int, string*, int);
bool filter(string srcIP, string srcPort, string dstIP, string dstPort, string protocol);
~PacketFilter(void);
private:
void update();
GlobalRuleProvider _globalProvider;
vector<RuleProvider*> _providers;
set<Rule> _rules;
};
问题出在哪里?出于某种原因,我怀疑基本的 RuleProvider
的构造函数。
问题是这个ifstream _file;
。流不可复制。
我遇到了一个奇怪的问题。我有以下 class:
#pragma once
#include <fstream>
#include "Rule.h"
#include <string>
#include <iostream>
using namespace std;
class RuleProvider
{
public:
RuleProvider(string);
bool isValid();
string getError();
bool isEOF();
virtual Rule readNext() = 0;
void set();
protected:
string _error;
string _path;
ifstream _file;
};
实现非常简单,由于某种原因无法编译,声称:
error C2248: 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream' : cannot access private member declared in class 'std::basic_ifstream<_Elem,_Traits>'
它引用我到最后一行。首先,成员甚至都不是私有的,在这个特定的抽象 class 中实际上没有成员是私有的。我就是找不到问题。
构造函数的实现如下:
RuleProvider::RuleProvider(string path) : _path(path)
{
this->_file.open(path);
}
其他函数仅使用ifstream
的内置函数,如is_open
等。
在主程序中,我初始化了一个对象,该对象通过他的构造函数初始化 RuleProvider
的许多派生 classes 并将它们(作为多态指针)推入一个向量中。这是该对象的构造函数中的代码片段:
(this->_providers).push_back(&this->_globalProvider);
for(int i = 0 ; i < orgProviderSize ; i++)
{
(this->_providers).push_back(new OrgRuleProvider(orgProviderPath[i]));
}
for(int i = 0 ; i < userProviderSize ; i++)
{
(this->_providers).push_back(new UserRuleProvider(userProviderPath[i]));
}
for(int i = 0 ; i < orgProviderSize + userProviderSize + 1 ; i++)
{
while(!((this->_providers)[i]->isEOF()))
{
this->_rules.insert((this->_providers)[i]->readNext());
}
}
这里是所有的函数声明(我在任何函数的定义中都没有提到 RuleProvider
这个词,所以我认为它是不必要的):
class GlobalRuleProvider : public RuleProvider
{
public:
GlobalRuleProvider(string);
virtual Rule readNext();
~GlobalRuleProvider(void);
};
另外 2 个 classes 完全相同,只是使用了另一个名称(以及 readNext()
的不同实现)- OrgRuleProvider
和 UserRuleProvider
.
class Rule
{
public:
Rule(string, string, string, string, string);
string getSrcIP() const;
string getDstIP() const;
string getSrcPort() const;
string getDstPort() const;
string getProtocol() const;
bool operator==(const Rule& other) const;
bool operator<(const Rule& other) const;
bool operator>(const Rule& other) const;
private:
static bool isValidIP(string);
static bool isValidPort(string);
static bool isValidProtocol(string);
string _srcIP;
string _srcPort;
string _dstIP;
string _dstPort;
string _protocol;
};
这是构造函数如上的通用对象:
class PacketFilter
{
public:
PacketFilter(string, string*, int, string*, int);
bool filter(string srcIP, string srcPort, string dstIP, string dstPort, string protocol);
~PacketFilter(void);
private:
void update();
GlobalRuleProvider _globalProvider;
vector<RuleProvider*> _providers;
set<Rule> _rules;
};
问题出在哪里?出于某种原因,我怀疑基本的 RuleProvider
的构造函数。
问题是这个ifstream _file;
。流不可复制。