std::ostream : class 不可访问 [C++]
std::ostream : class is inaccesible [C++]
我在实施中遇到此错误:
struct bookdatabase::Bookdatabase::Book
class "bookdatabase::BookDatabase::Book" is inaccessible
None 以下解决方案解决了我的问题:
- cannot access private members in friend ostream
- member of class inaccessible
- Inaccessible Members ?
Here's .cpp 文件中 visual studio 有问题的图片。
Here's一张头文件中声明的图片
Database.h
#include <string>
#include <vector>
#ifndef BOOKDATABASE_H
#define BOOKDATABASE_H
namespace bookdatabase {
class BookDatabase {
private:
struct Book {
private:
std::string authorFirstName, authorLastName, authorFullName, bookTitle, pubDate;
public:
Book(const std::string &authFirst, const std::string &authLast, const std::string &title, const std::string &date);
std::string getAuthor() const;
std::string getBookTitle() const;
std::string getPubDate() const;
bool operator < (const Book &rhs) const;
friend std::ostream& operator << (std::ostream& out, const bookdatabase::BookDatabase::Book& book);
};
void sortBooks();
std::vector<Book>::iterator search(const std::string &title);
public:
BookDatabase();
void printBookList();
std::vector<Book> getDatabase() const;
void removeBook(const std::string &title);
void addBook(const std::string &authFirst, const std::string &authLast, const std::string &title, const std::string &date);
private:
std::vector<Book> database;
};
}
#endif // BOOKDATABASE_H
Database.cpp
std::ostream & bookdatabase::operator<<(std::ostream & out, const bookdatabase::BookDatabase::Book & book) {
out << authorFullName << ". " << bookTitle << ". " << pubDate;
return out;
}
我遇到这个问题是因为 Book
class 是嵌套的 class 吗?
好的,我似乎在这里发现了两件事,这可能是您遇到的问题,其中一件可能是 Visual Studio.
中的错误
1。首先,不是bug的东西
user0042,他对你的 post 的回应是正确的,operator<<
在 struct Book
中被声明为 friend
结果 operator<<
只能够访问 Book
的私有成员。但它不能访问 Book
本身,因为 Book
是封闭 BookDatabase
class 的私有成员。因此,您必须将好友声明移到 Book
之外和 BookDatabase
.
中
完成后,operator<<
现在可以访问 BookDatabase
的私有数据成员 Book
。但是请注意,这并没有授予 operator<<
访问 Book
本身的私有数据成员的权限,即 authorFirstName, authorLastName, authorFullName, bookTitle, pubDate
2A。现在(我认为是)VS2017 范围运算符错误
假设您已将友元声明移至BookDatabase
,您仍然需要以特定方式定义实现。以下两段代码应该是在 Database.cpp
文件中定义函数的等效方法,但其中一段在 VS2017 15.4.5.[=38 中不起作用=]
可以做
namespace bookdatabase {
ostream& operator<<(ostream& out, const bookdatabase::BookDatabase::Book& book) {
}
} // OK
但做起来不好
ostream& bookdatabase::operator<<(ostream& out, const bookdatabase::BookDatabase::Book& book) {
} // Visual Studio cannot access book
Visual Studio 的 ::
运算符似乎存在问题,无法获取函数的 friend
属性。
所以回答你的问题:如果你想让你的 << 运算符重载工作,你需要使用第一种方法在 .cpp 实现文件中定义它。
2B。事实上,我写了一个简单的测试程序来显示 VS2017 friend
和 ::
bug
namespace my_namespace {
class Test {
private:
struct Nested {};
public:
friend void func(Test::Nested&);
};
void func(Test::Nested&);
}
// DOES NOT COMPILE in VS2017 15.4.5, OK in GCC 6.3 and Clang 3.8.0
// VS2017 says Nested is inaccessible
void my_namespace::func(my_namespace::Test::Nested&) {
}
但使用 namespace
和方括号有效
namespace my_namespace {
class Test {
private:
struct Nested {};
public:
friend void func(Test::Nested&);
};
void func(Test::Nested&);
}
// changed to namespace + brackets,
// COMPILES in VS2017 15.4.5, GCC 6.3 and Clang 3.8.0
namespace my_namespace {
void func(my_namespace::Test::Nested&) {
}
}
有人可以独立验证吗?
对于大多数 operator << 问题,我的回答是声明一个成员 print() 方法来完成艰苦的工作并从 operator << 调用它。
通常我很高兴 print 方法是 public,摆脱所有朋友的脏话。
我在实施中遇到此错误:
struct bookdatabase::Bookdatabase::Book
class "bookdatabase::BookDatabase::Book" is inaccessible
None 以下解决方案解决了我的问题:
- cannot access private members in friend ostream
- member of class inaccessible
- Inaccessible Members ?
Here's .cpp 文件中 visual studio 有问题的图片。
Here's一张头文件中声明的图片
Database.h
#include <string>
#include <vector>
#ifndef BOOKDATABASE_H
#define BOOKDATABASE_H
namespace bookdatabase {
class BookDatabase {
private:
struct Book {
private:
std::string authorFirstName, authorLastName, authorFullName, bookTitle, pubDate;
public:
Book(const std::string &authFirst, const std::string &authLast, const std::string &title, const std::string &date);
std::string getAuthor() const;
std::string getBookTitle() const;
std::string getPubDate() const;
bool operator < (const Book &rhs) const;
friend std::ostream& operator << (std::ostream& out, const bookdatabase::BookDatabase::Book& book);
};
void sortBooks();
std::vector<Book>::iterator search(const std::string &title);
public:
BookDatabase();
void printBookList();
std::vector<Book> getDatabase() const;
void removeBook(const std::string &title);
void addBook(const std::string &authFirst, const std::string &authLast, const std::string &title, const std::string &date);
private:
std::vector<Book> database;
};
}
#endif // BOOKDATABASE_H
Database.cpp
std::ostream & bookdatabase::operator<<(std::ostream & out, const bookdatabase::BookDatabase::Book & book) {
out << authorFullName << ". " << bookTitle << ". " << pubDate;
return out;
}
我遇到这个问题是因为 Book
class 是嵌套的 class 吗?
好的,我似乎在这里发现了两件事,这可能是您遇到的问题,其中一件可能是 Visual Studio.
中的错误1。首先,不是bug的东西
user0042,他对你的 post 的回应是正确的,operator<<
在 struct Book
中被声明为 friend
结果 operator<<
只能够访问 Book
的私有成员。但它不能访问 Book
本身,因为 Book
是封闭 BookDatabase
class 的私有成员。因此,您必须将好友声明移到 Book
之外和 BookDatabase
.
完成后,operator<<
现在可以访问 BookDatabase
的私有数据成员 Book
。但是请注意,这并没有授予 operator<<
访问 Book
本身的私有数据成员的权限,即 authorFirstName, authorLastName, authorFullName, bookTitle, pubDate
2A。现在(我认为是)VS2017 范围运算符错误
假设您已将友元声明移至BookDatabase
,您仍然需要以特定方式定义实现。以下两段代码应该是在 Database.cpp
文件中定义函数的等效方法,但其中一段在 VS2017 15.4.5.[=38 中不起作用=]
可以做
namespace bookdatabase {
ostream& operator<<(ostream& out, const bookdatabase::BookDatabase::Book& book) {
}
} // OK
但做起来不好
ostream& bookdatabase::operator<<(ostream& out, const bookdatabase::BookDatabase::Book& book) {
} // Visual Studio cannot access book
Visual Studio 的 ::
运算符似乎存在问题,无法获取函数的 friend
属性。
所以回答你的问题:如果你想让你的 << 运算符重载工作,你需要使用第一种方法在 .cpp 实现文件中定义它。
2B。事实上,我写了一个简单的测试程序来显示 VS2017 friend
和 ::
bug
namespace my_namespace {
class Test {
private:
struct Nested {};
public:
friend void func(Test::Nested&);
};
void func(Test::Nested&);
}
// DOES NOT COMPILE in VS2017 15.4.5, OK in GCC 6.3 and Clang 3.8.0
// VS2017 says Nested is inaccessible
void my_namespace::func(my_namespace::Test::Nested&) {
}
但使用 namespace
和方括号有效
namespace my_namespace {
class Test {
private:
struct Nested {};
public:
friend void func(Test::Nested&);
};
void func(Test::Nested&);
}
// changed to namespace + brackets,
// COMPILES in VS2017 15.4.5, GCC 6.3 and Clang 3.8.0
namespace my_namespace {
void func(my_namespace::Test::Nested&) {
}
}
有人可以独立验证吗?
对于大多数 operator << 问题,我的回答是声明一个成员 print() 方法来完成艰苦的工作并从 operator << 调用它。 通常我很高兴 print 方法是 public,摆脱所有朋友的脏话。