编译器无法推断出要返回的模板类型

Compiler cannot deduce which template type to return

本文关键字:类型 返回 推断出 编译器      更新时间:2023-10-16

相关代码是:

std::fstream fout("Logs.txt");
class Logs;
typedef std::ostream& (*ostream_manipulator2)(std::ostream&);
class LogsOutput
{
public:
    LogsOutput() {}
    ~LogsOutput() {}
    Logs * pLogs;
    friend LogsOutput& operator<<(LogsOutput &logsClass, std::string &strArg);
    friend LogsOutput& operator<<(LogsOutput &logsClass, const char *strArg);
    friend LogsOutput& operator<<(LogsOutput &logsClass, ostream_manipulator2 pf);
    friend LogsOutput& operator<<(LogsOutput &logsClass, uint64_t number);
};
LogsOutput *pLogsOutput;  
template <typename T>  
T& LOUToutput()
{
                    if (pLogsOutput)
                    {
                        return (*pLogsOutput);
                    }
                    else
                        return fout;
}

我想将此功能称为:

LOUToutput () << "Print this line " << std::endl;

有时未创建LogsOutput类,因此,在这种情况下,我宁愿输出文件来删除其指针会崩溃。我知道编译器无法在编译时告诉LogsOutput类是否会实例化,因此无法推断模板的类型,但是我看不出任何其他方法可以使它起作用。所以我的问题是我的功能如何根据运行时间条件返回其他类型?

复杂的解决方案是使用继承。如果您要从std :: Ostream继承,则可以返回一个普通的基类(如果您有兴趣,这是一个讨论:如何从std :: Ostream继承?)

更简单的解决方案是imo。

struct LogProxy {
    LogsOutput *pLog;
    // ...
    LogProxy &operator<<(std::string &o) {
       if(pLogsOutput) {
          *pLog << o;
       } else {
          // Assuming this is available as a global.. You probably don't want to do that
          fout << o;
       }
       return *this;
    }
    // ....
};
LogProxy LOUToutput() {
    return LogProxy { pLogsOutput; };
}

其他一些一般性评论:

  1. 如果要使用模板,则需要使其成为编译时间条件。您可以使用STD :: enable_if&lt;>提供多个模板的LoutOutput()的多个模板过载,这些模板在 compile 时选择时间登录到。

  2. 我猜这仅是为了发布到So的目的,但是您的代码在标题文件中声明了多个Globals。您需要解决这个问题。

  3. 您的代码上没有const声明。许多操作员看起来至少应该在输出(字符串,.ETC。)参数上声明const。

编辑:这是此想法的工作(正确编译)样本:

#include <iostream>
struct PRXY {
    bool cond;
    const PRXY &operator<<(const std::string &t) const {
        if(cond) {
            std::cout << t;
        } else {
            std::cerr << t;
        }
        return *this;
    }
};
PRXY pr(bool cond) {
    return PRXY { cond };
}
void test() {
    pr(false) << "Hello";
}