我正在试图创建一个日志到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:\保管箱\工作空间 - 视觉工作室\ peuler \ peuler \ problemsmanager.h(37)': '< <'[可经由发现参数依赖查找]
有趣的是,你的模板函数的定义与它们的声明是分开的;我认为这是不可能的,因为每个需要使用模板化定义的文件都无法从声明中生成它们(因为定义本身在完全不同的cpp文件中)。我很惊讶,它甚至编译o.O – Suedocode
'logger'类型是封闭类型'ProblemsManager'的专用类型吗? –
是的,它是私人的。 –