【问题标题】:How to modify datatype in function calling?如何在函数调用中修改数据类型?
【发布时间】:2015-05-08 11:56:09
【问题描述】:

我有以下课程

  template<class TDataType> 
  void SetProperties(IndexType PropertiesId, 
                     const Variable<TDataType>& rVariable, 
                     const TDataType& Value)
  {
      mpModeler->SetProperties(PropertiesId, rVariable, Value);
  }

template<typename TDataType, std::size_t N>
void SetProperties(IndexType PropertiesId,
    const Variable<TDataType>& rVariable,
    const TDataType(&Value)[N])
{
    mpModeler->SetProperties(PropertiesId, rVariable, Value);
}

函数mpModeler::SetProperties定义如下

  template<class TDataType> 
  void SetProperties(IndexType PropertiesId, 
                     const Variable<TDataType>& rVariable, 
                     const TDataType& Value)
  {
      if (mpModel->GetProperties(PropertiesId).get() == 0)
      {
          mpModel->AddProperties(PropertiesId, Properties::Pointer(new Properties(*mpModel)));
      }

      PropertyFunction<TDataType>::Pointer constant_property(new ConstantProperty<TDataType>(Value));

      mpModel->GetProperties(PropertiesId)->SetProperty(rVariable, constant_property);
  }

可以这样调用:

pKernel->SetProperties(i, *double_variable, regionmapi[0]);

其中 regionmapi 被定义为

double *regionmapi;

或者像这样:

pKernel->SetProperties(i, *double_variable, tmp3);

tmp3 定义为

double tmp3[3];

但现在显示以下错误:

Error   7   error C2782: 'void Kratos::Modeler::SetProperties(Kratos::Modeler::IndexType,const Kratos::Variable<TDataType> &,const TDataType &)' : template parameter 'TDataType' is ambiguous

谁能帮我看看?

谢谢,

唐老鸭

【问题讨论】:

  • 首先,为什么不先将regionmapi 设为std::vector?其次,您确定要将value 的类型强制为double* 而不是TDataType
  • 至于你的问题,要不要对value数组中的所有元素调用原来的SetProperties
  • 感谢您的回复。是的,但是我不知道如何将值数组传递给TDataType值,你能给我一些提示吗?
  • 输入数据是'double *value',但是不知道怎么转换成TDataType值,谢谢
  • 什么 TDataType?会永远一样吗?它是否与values 数组的基本类型相同(即您的示例中的double)?它会与double 兼容吗?您是否尝试过在没有任何“转换”的情况下使用它?一个简单的static_cast 怎么样?

标签: c++ arguments overlap


【解决方案1】:

您也可以通过 const 引用,通过模板传递数组,它的大小将自动推导出:

template<class TDataType, std::size_t N> 
void SetProperties(IndexType PropertiesId, 
               const Variable<TDataType>& rVariable, 
               const TDataType(&Value)[N])

但您需要一个额外的模板非类型参数size_t N。简单的例子

#include <iostream>

template <typename TDataType, size_t N>
void f(const TDataType(&Value)[N])
{
    std::cout << "Size: " << N;
}

int main()
{
    int arr[5];
    f(arr); // displays 5
}

缺点是它不适用于指针。

【讨论】:

  • 对不起,我还是不知道怎么办,能不能给我详细点?谢谢
  • @TangLaoya 查看更新后的编辑,了解您的函数声明的外观。
  • 非常感谢。我按照您的建议进行了修改,但现在错误是:错误 7 错误 C2782: 'void Kratos::Modeler::SetProperties(Kratos::Modeler::IndexType,const Kratos::Variable &,const TDataType &)' : 模板参数“TDataType”不明确
  • 从您发布的错误来看,Kratos::Modeler::SetProperties 似乎没有通过引用获取数组(最后一个参数是const TDataType&amp;,但应该是const TDataType(&amp;)[N])。您还需要修改您的Kratos::Modeler::SetProperty
  • 感谢您的回复。我编辑了问题并添加了“Setproperties”的真实实例,您能帮我看看吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多