我有一个用于记录的类,该类绝对不能继承std::ostream,并为与标准输出流相同的类型定义了operator class MyLoggingClass {[...]public: template<typename T> MyLoggingClass & operator<<( T& data ){ ... }}另外,对于程序中的每个可打印类,我都定义了典型的非成员函数:std::ostream & operator << ( std::ostream & os, const OneOfMyClasses & foo );问题是,在内部,我的记录器有时使用标准输出流,这是:template<typename T>MyLoggingClass & operator<<( T& data ){ [...] if( someCondition ) { cout << data; } [...]}因此,我可以记录我的类,而无需在每个类上显式复制MyLoggingClass的非成员操作符MyLoggingClass logger;logger << OneOfMyClasses(params); // Here I am invoking the constructor of class "OneOfMyClasses"事实是,不是调用构造函数,而是将对象作为operator 当然,针对此问题的一些有效解决方案包括:删除模板运算符删除模板化运算符存储该对象以登录时间变量,然后执行“logger 但是,我想知道是否有一种方法可以强制编译器评估构造函数调用。您知道这种情况下的任何解决方法吗? 预先感谢您的时间:) (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 我认为这是问题所在:template<typename T> MyLoggingClass & operator<<( T& data ){ ... }data是非常量引用,该行:logger << OneOfMyClasses(params);正在尝试将临时绑定(bind)到非常量引用。改成:template<typename T> MyLoggingClass & operator<<(const T& data ){ ... } //^^^^^ (adsbygoogle = window.adsbygoogle || []).push({}); 10-05 23:01