我在我的实现中收到此错误:
struct bookdatabase::Bookdatabase::Book
类“bookdatabase::BookDatabase::Book”无法访问
以下解决方案均未解决我的问题:
这是 Visual Studio 在 .cpp 文件中存在问题的图片。
这是头文件中声明的图片。
#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
std::ostream & bookdatabase::operator<<(std::ostream & out, const bookdatabase::BookDatabase::Book & book) {
out << authorFullName << ". " << bookTitle << ". " << pubDate;
return out;
}
我有这个问题是因为Book
该类是嵌套类吗?
好吧,我似乎在这里发现了两件事,这可能是您遇到的问题,其中之一可能是 Visual Studio 中的错误。
user0042,在他对你的帖子的回应中是正确的,在结果中operator<<
被声明为唯一能够访问. 但它不能访问自身,因为它是封闭类的私有成员。因此,您必须将朋友声明移动到外部和内部。friend
struct Book
operator<<
Book
Book
Book
BookDatabase
Book
BookDatabase
一旦你这样做,operator<<
现在可以访问私有数据成员Book
的BookDatabase
。但是请注意,这并没有授予operator<<
访问Book
自身私有数据成员的权限,即authorFirstName, authorLastName, authorFullName, bookTitle, pubDate
假设您已将朋友声明移至BookDatabase
,您仍然必须以特定方式定义实现。以下两段代码应该是在Database.cpp
文件中定义函数的等效方式,但其中一段在 VS2017 15.4.5 中不起作用。
没问题
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 实现文件中定义它。
friend
和::
bugnamespace 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&) {
}
}
有人可以独立验证这一点吗?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句