【问题标题】:invalid conversion from 'void* - casting'void* 的无效转换 - 强制转换
【发布时间】:2015-12-25 19:39:14
【问题描述】:

我对在 gcc 下编译没有问题但在 g++ 下没有问题的代码有疑问。我正在转向 g++,因为我想利用 boost 进行一些多线程改进。我得到的错误是这样的:

invalid conversion from 'void* volatile' to 'TrialVect*'

这段代码是:

static void funcSize( struct TrialVect *vector ) {
  if ( vector->field ) {
    struct TrialVect *ptr = BO2V (vector->first,vector->second);
   }
}

当我用谷歌搜索时,转换变量存在一些问题,为什么?建议如何解决?

【问题讨论】:

  • 从 void* 到其他指针类型的隐式转换是 C 的事情,这似乎是编写这些 sn-ps 的语言。C++ 没有那种隐式转换。要么进行手动转换,要么用适当的 C++ 重写代码。

标签: c++ casting


【解决方案1】:

在 C++ 中,任何指针都可以隐式转换 void*,但转换 void* 需要显式转换。

试试这个:

auto ptr = static_cast<TrialVect* volatile>( BO2V (vector->first,vector->second) );

volatile 是必须单独处理的属性(如const);新指针必须与旧指针匹配,或者您可以使用单独的const_cast 更改const/volatile 属性。例如,

auto ptr = static_cast<TrialVect*>( const_cast<void*>( BO2V(vector->first, vector->second) ) );

删除volatile 属性是否安全取决于应用程序。

【讨论】:

  • 第一个 sn-p 中的 volatile 应该应用于指针,而不是 TrialVect :)
  • @LogicStuff 我想我可以回去睡觉了 :)
  • @Tiutto 请再试一次,我已经修复了 sn-p。
  • static_cast&lt;TrialVect *&gt;(BO2V (vector-&gt;first,vector-&gt;second)) 应该足够了。即使BO2V (vector-&gt;first,vector-&gt;second) 是一个扩展为void* 类型的volatile 限定左值的宏,在应用左值到右值转换后,您也只有void* 类型的值,没有@987654338 @那里的任何地方。 (或者可能是 BO2V 定义本身内部的错误,在这种情况下,对结果的任何操作都不会产生影响。我猜不是这样,但我不能排除它。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 2012-04-12
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多