std::ostream : 类不可访问 [C++]

詹姆斯·帕特蒙

我在我的实现中收到此错误:

struct bookdatabase::Bookdatabase::Book

类“bookdatabase::BookDatabase::Book”无法访问

以下解决方案均未解决我的问题:

是 Visual Studio 在 .cpp 文件中存在问题的图片。

这是头文件中声明的图片。


数据库.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


数据库.cpp

std::ostream & bookdatabase::operator<<(std::ostream & out, const bookdatabase::BookDatabase::Book & book) {
    out << authorFullName << ". " << bookTitle << ". " << pubDate;
    return out;
}


我有这个问题是因为Book该类是嵌套类吗?

林林

好吧,我似乎在这里发现了两件事,这可能是您遇到的问题,其中之一可能是 Visual Studio 中的错误。

1.首先,不是bug的东西

user0042,在他对你的帖子的回应中是正确的,结果中operator<<被声明为唯一能够访问. 但它不能访问自身,因为它是封闭的私有成员因此,您必须将朋友声明移动到外部和内部friendstruct Bookoperator<<BookBookBookBookDatabaseBookBookDatabase

一旦你这样做,operator<<现在可以访问私有数据成员BookBookDatabase但是请注意,这并没有授予operator<<访问Book自身私有数据成员的权限,即authorFirstName, authorLastName, authorFullName, bookTitle, pubDate

2A。现在是(我认为是)VS2017 范围运算符错误

假设您已将朋友声明移至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 实现文件中定义它。

2B。其实我写了一个简单的测试程序来展示VS2017friend::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&) {
    } 
}

有人可以独立验证这一点吗?

我还在Microsoft Developer Community 上发布了错误报告

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章