0

我试图编译这个(--std=c++0x)使用:

  • [FAIL with --std=c++0x flag] clang 版本 3.2-1~exp9ubuntu1 (tags/RELEASE_32/final) (基于 LLVM 3.2)
  • [FAIL without --std=c++0x flag] clang 版本 3.2-1~exp9ubuntu1 (tags/RELEASE_32/final) (基于 LLVM 3.2)
  • [FAIL without --std=c++11 flag] Apple LLVM 版本 5.0 (clang-500.2.79) (基于 LLVM 3.3svn)
  • [FAIL with --std=c++11 flag] Apple LLVM 版本 5.0 (clang-500.2.79)(基于 LLVM 3.3svn)
  • [通过 --std=c++0x 标志] gcc 版本 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1)
  • [没有 --std=c++0x 标志的失败] gcc 版本 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;
}
4

2 回答 2

1

作为一个起点,你从s#的开头就错过了。#include

#include <iostream>
#include <cstdint>

您也没有包含任何应该定义 type 的标题timeval。鉴于您显然正在使用的系统,您可能想要:

#include <sys/time.h>

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

#include <winsock2.h>

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

于 2013-11-06T14:34:17.097 回答
0

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

operator timeval() const {
    return _timeval;
}

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

于 2013-11-06T14:34:15.197 回答