C++选角问题

C++ casting issue

本文关键字:问题 C++      更新时间:2023-10-16

我尝试使用以下方法编译它(--std=c++0x):

  • [FAIL with --std=c++0x flag] clang version 3.2-1~exp9ubuntu1 (tags/RELEASE_32/final) (基于 LLVM 3.2)
  • [FAIL without --std=c++0x flag] clang version 3.2-1~exp9ubuntu1 (tags/RELEASE_32/final) (基于 LLVM 3.2)
  • [FAIL without --std=c++11 flag] Apple LLVM version 5.0 (clang-500.2.79) (基于 LLVM3.3svn)
  • [FAIL with --std=c++11 flag] Apple LLVM version 5.0 (clang-500.2.79) (基于 LLVM3.3svn)
  • [PASS with --std=c++0x flag] gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1)
  • [FAIL without --std=c++0x flag] gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1)

当它在 clang ubuntu 失败时,会产生以下错误:

test.cpp:26:37: error: no viable conversion from 'const P' to 'timeval'
        return static_cast<timeval>(_p);
                                    ^~
/usr/include/x86_64-linux-gnu/bits/time.h:30:8: note: candidate constructor
      (the implicit copy constructor) not viable: no known conversion from 'const P' to
      'const timeval &' for 1st argument
struct timeval
       ^
/usr/include/x86_64-linux-gnu/bits/time.h:30:8: note: candidate constructor
     (the implicit move constructor) not viable: no known conversion from 'const P' to 'timeval &&' for
      1st argument
struct timeval
       ^
test.cpp:9:5: note: candidate function
    operator const timeval() const {
    ^
test.cpp:13:5: note: candidate function
    operator const int8_t() const {
    ^

不确定我做错了什么。

#include <iostream>
#include <cstdint>
union P {
    timeval _timeval;
    int8_t  _int8_t;
    uint8_t _uint8_t;
    operator const timeval() const {
        return _timeval;
    }
    operator const int8_t() const {
        return _int8_t;
    }
};

struct Y {
    operator const int8_t() const {
        return static_cast<int8_t>(_p);
    }
    operator const timeval() const {
        return static_cast<timeval>(_p);
    }
    P _p;
};
int main()
{
    Y testobj;
    timeval ret = static_cast<timeval>(testobj);
    return 0;
}

作为起点,你错过了从#include开始的#

#include <iostream>
#include <cstdint>

您也没有包含任何应定义类型 timeval 的标头。鉴于您显然正在使用的系统,您可能需要:

#include <sys/time.h>

如果您使用的是Windows,那可能是:

#include <winsock2.h>

可能还有更多的问题,但这至少应该让你开始朝着正确的大方向前进。

您可能需要

从转换运算符中删除第一个const,因为您稍后尝试将联合转换为非常量值:

operator timeval() const {
    return _timeval;
}

滥用转换运算符似乎是一个坏主意。如果要封装,请考虑创建适当的方法,例如 timeval getTimeval() const