如何动态转换未命名类型的内容

时间:2018-12-14 22:33:07

标签: c++

我对C ++不太强,所以请忍受我:-)

我正在尝试调试其他人的代码。我相信该代码在gcc4中有效,但在gcc6中却嘎吱作响。 (仅供参考,我不是100%)

这是代码的摘录...

  if (IsCacheManagementRequest()) {
    auto vicQAlloc = GetTransaction<tVicQAllocConst>(k_VicQAlloc);
    return log2(vicQAlloc->GetAllocate());
  } else if (IsL3Victim()) {
    auto vicQAlloc = GetSourceOfL3Victim()->GetTransaction<tVicQAllocConst> (k_VicQAlloc);    
    return log2(vicQAlloc->GetAllocate());
  } else if (IsTraceCaptureRequest()) {
etc...

这是我遇到的错误(错误消息指向摘录中的第三行“ log2(...)”)...

 error: call of overloaded 'log2(nL3s::cVicQAlloc::tAllocate)' is ambiguous                 

据我所读,vicQAlloc-> GetAllocate()没有返回特定类型(至少不够具体)和/或log2函数未指定所需的数据类型。模棱两可,我得到这个错误。

我了解到,如果您投射返回的东西,则可能会解决问题。  所以我尝试了动态投射,但失败了...

if (IsCacheManagementRequest()) {
    auto vicQAlloc = GetTransaction<tVicQAllocConst>(k_VicQAlloc);
    return log2(dynamic_cast<vicQAlloc->GetAllocate()>);
} else if (IsL3Victim()) {
    auto vicQAlloc = GetSourceOfL3Victim()->GetTransaction<tVicQAllocConst (k_VicQAlloc);
return log2(dynamic_cast<vicQAlloc->GetAllocate()>);
} else if (IsTraceCaptureRequest()) {
etc... 

错误消息...

error: 'vicQAlloc' does not name a type                                                                                                                                                  
     return log2(dynamic_cast<vicQAlloc->GetAllocate()>);     

我正在寻找一种方法来解决这个问题而又不会连根拔起。如果gcc6对此很挑剔,而gcc4却没有,那么是否有办法使其表现得像gcc4一样? (也许是编译选项?)。

有什么想法吗?

=======================

更新

我认为我找到了“ log2”的声明。看来我在某种名为“ nmathcalls.h”的标头中安装了第三方pkg。在这里...

/* Compute base-2 logarithm of X.  */
__MATHCALL (log2,, (_Mdouble_ __x));
__END_NAMESPACE_C99
#endif

Mdouble?

该文件的标题中有Mdouble的描述...

This file provides prototype declarations for the math functions.
Most functions are declared using the macro:

__MATHCALL (NAME,[_r], (ARGS...));

This means there is a function `NAME' returning `double' and a function
`NAMEf' returning `float'.  Each place `_Mdouble_' appears in the
prototype, that is actually `double' in the prototype for `NAME' and
`float' in the prototype for `NAMEf'.  Reentrant variant functions are
called `NAME_r' and `NAMEf_r'.

那么这东西只是在寻找双倍吗?

2 个答案:

答案 0 :(得分:1)

好的,这似乎已经解决了。我只是将参数转换为双...

return log2((double) vicQAlloc->GetAllocate());

感谢大家的指点。找到log2的def是关键!

答案 1 :(得分:0)

考虑到您已经用注释中的一些提示回答了自己的问题;简而言之:

这是有问题的代码行:

return log2(vicQAlloc->GetAllocate());

这是编译器错误的一部分:

error: call of overloaded 'log2(nL3s::cVicQAlloc::tAllocate)' is ambiguous

您已经确定自己会变得模棱两可,这就是必然。

然后问题变成:如何解决歧义?

然后您发现了签名-log2(...){...;}的定义

现在,问题变成log2()接受或期望哪种类型; vicQAlloc->GetAllocate()返回什么类型?

一旦您了解了以上两个,最后的问题就变成了:如何将返回类型转换或转换为期望的参数类型?