错误:从 'int' 到 'std::_Ios_Openmode' 的转换无效|

error: invalid conversion from 'int' to 'std::_Ios_Openmode'|

本文关键字:转换 无效 Openmode int 错误 std Ios      更新时间:2023-10-16

我试图使用这个c++类作为我自己的应用程序的客户端/服务器通信的基础。但是它抛出了一个错误,我不明白,它在myLog.cpp

error: invalid conversion from 'int' to 'std::_Ios_Openmode'|

在这里:

void myLog::openLog(const string& fileName, int mode)
{
   if (logLevel < QUIET_MODE)
   {
      open(fileName.c_str(),mode); //Error line
      /* SNIP */

这里叫做

void myLog::init()
{
   openLog("syslog.log",LOG_WRITE);
}

和LOG_WRITE在头中定义如下:

const int LOG_WRITE  = ios::out;
谁能告诉我为什么会这样?

快速链接到代码:myLog.cpp——myLog.h

ios::out不是int而是std::_Ios_Openmode

这个问题已经有答案了。但是,对于正在使用日志工具的人,请执行以下操作:

在标题中更改:

    const int LOG_WRITE  = ios::out;
    const int LOG_APPEND = ios::app;

    const std::ios_base::openmode LOG_WRITE  = std::ios::out;
    const std::ios_base::openmode LOG_APPEND = std::ios::app;

将Init函数从int更改为std::ios_base::openmode,例如

    ..., std::ios_base::openmode mode)

使用int可以在OSX上工作,但在RHEL 5.10上失败。一旦我做了上述更改,它就可以在RHEL 5.10上工作了。

OSX:

$ gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix

RHEL 5.10:

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.8.3/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: /SDK/GCC/objdir/../gcc-4.8.3/configure
Thread model: posix
gcc version 4.8.3 (GCC) 

在OSX上,类型定义为:

typedef unsigned int openmode;
typedef openmode     open_mode;
static const openmode app    = 0x01;
static const openmode ate    = 0x02;
static const openmode binary = 0x04;
static const openmode in     = 0x08;
static const openmode out    = 0x10;
static const openmode trunc  = 0x20;