如何在函数调用中修改数据类型?

时间:2015-05-08 11:56:10

标签: c++ arguments overlap

我有以下课程

  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

任何人都可以帮我看一下吗?

谢谢,

唐老鸭

1 个答案:

答案 0 :(得分:0)

您也可以通过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
}

缺点是它不适用于指针。