编译器无法推断出要返回的模板类型
Compiler cannot deduce which template type to return
相关代码是:
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; };
}
其他一些一般性评论:
-
如果要使用模板,则需要使其成为编译时间条件。您可以使用STD :: enable_if&lt;>提供多个模板的LoutOutput()的多个模板过载,这些模板在 compile 时选择时间登录到。
-
我猜这仅是为了发布到So的目的,但是您的代码在标题文件中声明了多个Globals。您需要解决这个问题。
-
您的代码上没有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";
}
相关文章:
- 如何在模板参数中分离函数类型返回类型和参数
- 为什么要为指针返回类型返回一系列字符?
- 有没有办法根据运行时值的类型返回 constexpr 对象
- 从弱指针返回类型返回共享指针
- 无法为unique_ptr返回类型返回 nullptr
- 为什么双重类型返回无穷大
- std::is_arithmetic 为通用 lambda 中的 int 类型返回 false:未定义的行为?
- C 策略设计具有可变类型返回值
- 根据类型返回一个值
- 在C++中,将double转换为long的类型返回了不正确的值
- 作为宏参数的安装类型返回错误:字符串常量之前的预期非限定 id
- 具有引用类型返回的函数
- C++ 如何使模板<T>f() 为整数 T 返回 -1,为指针类型返回 nullptr
- C++模板:按类型返回值
- 以Integer返回类型返回浮点值
- 使用 C++14 的自动功能类型返回扣除代替 std::common_type 是否始终安全?
- 为什么允许新运算符向每个指针类型返回*void
- 适当的函数返回类型返回日期时间
- c++中布尔类型返回函数的默认返回值
- 在c#中使用非托管c++代码对所有double类型返回0