1

我正在尝试制作一个记录到 std::cout 和文件的记录器。这是我的课:

.h 文件:

class ProblemsManager {
        (...)
private:
        (...)

    class logger {
    private: 
        std::ofstream fileStream;
        static const std::string LOG_PATH;
    public: 
        logger();
        ~logger();


    template<class T> 
    friend logger & operator<<(logger &log, const T & bytes) {
        log.fileStream<<bytes;
        std::cout<<bytes;
        return log;
    }
    };
};

.cpp 文件

(...)
const std::string ProblemsManager::logger::LOG_PATH = "F:\\Dropbox\\workspace - Visual Studio\\PEuler\\PEuler\\PEuler.log";

ProblemsManager::logger::logger() : fileStream(LOG_PATH,std::ofstream::out) {}
ProblemsManager::logger::~logger() {}

然后,如果我尝试这样做:

ProblemsManager::logger log;
log<<"test";

我得到:

1>f:\dropbox\workspace - visual studio\peuler\peuler\problemsmanager.cpp(47): error C3767: '<<': 候选函数不可访问 1> 可能是 'f:\ dropbox\workspace - visual studio\peuler\peuler\problemsmanager.h(37)' : '<<' [可以通过参数相关查找找到]

4

3 回答 3

3

您的模板有几个问题,首先是两者仅在参考上有所不同,这会导致问题。您只需要一个(读取而不写入参数):

    template<class T> 
    friend logger & operator<<(logger& log, const T & bytes);
    //                                      ^^^^^

现在第二个问题是模板应该定义在编译器在生成实例时可以看到的地方。这基本上意味着定义必须在标头中,而不是在 .cpp 文件中。[*]

除此之外,由于该logger类型是私有的ProblemsManager,因此您无法从命名空间级别访问它,因此您将在定义自由函数时遇到问题,因为它无法访问嵌套类型。选项将公开类型,使函数也成为 的朋友ProblemsManager,或者正如我建议的那样,只需在类定义中定义模板内联:

class ProblemsManager {
private:
    class logger {
        template<class T> 
        friend logger & operator<<(logger& log, T & bytes) {
           // implementation goes here
        } 
    };
};

[*]这实际上可能是规则的例外,因为作为私有类型,我只能假设所有使用 thelogger以及因此operator<<将发生在定义ProblemsManager成员的翻译单元内。如果是这种情况,您可以忽略这一段。

于 2013-08-01T21:21:32.450 回答
0

由于 operator<< 函数不是成员而是朋友,因此您不能在其中使用“this”。您可能希望在此处返回“log”并使用“log.”适当地限定日志成员。

于 2013-08-01T21:03:21.903 回答
0

我会试一试。

log<<"test";

上面的调用是对 operator<< 函数的调用,第一个参数是 logger &,第二个参数是 const char[5]。

第一个重载可能无法绑定,因为您正在重载引用并传递 const 对象。第二个失败,因为您按值传递数组并且您不能这样做。我只是不确定为什么你的数组没有折叠到指针。

您是否尝试过重载 const 引用?顺便说一句 - 为什么你会超载价值和参考?

于 2013-08-01T21:24:32.617 回答