gpt4 book ai didi

c++ - 无法特化函数模板。重载运算符<<

转载 作者:行者123 更新时间:2023-11-30 02:53:27 25 4
gpt4 key购买 nike

我正在尝试制作一个记录到 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)' 处的友元函数:'<<' [可以通过参数相关查找找到]

最佳答案

您的模板有几个问题,第一个是两者仅在引用上有所不同,这会导致问题。你只想要一个(读取但不写入参数):

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

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

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

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

[*] 这实际上可能是规则的异常(exception),因为作为私有(private)类型,我只能假设 logger 的所有使用因此 operator<<将在定义 ProblemsManager 的翻译单元中发生成员。如果是这样的话,你可以忽略这一段。

关于c++ - 无法特化函数模板。重载运算符<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18004459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com