我有以下课程
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
任何人都可以帮我看一下吗?
谢谢,
唐老鸭答案 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
}
缺点是它不适用于指针。