2015-05-08 2 views
0

У меня есть следующий классКак изменить тип данных при вызове функции?

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 

может кто-нибудь помочь мне взглянуть на него ?

Спасибо,

Тан Laoya

+1

Прежде всего, почему бы не сделать 'regionmapi'' 'std :: vector' для начала? Во-вторых, вы уверены, что хотите заставить тип 'значение'' double * 'вместо' TDataType'? –

+0

Что касается вашей проблемы, вы хотите вызвать исходный 'SetProperties' для всех элементов массива' value'? –

+0

Спасибо за ваш ответ. Да, но я не знаю, как передать массив значений в значение TDataType, можете ли вы дать мне несколько советов? –

ответ

0

Вы также можете передать массив по константной ссылке, с помощью шаблона, и его размер будет автоматически выводится:

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 
} 

Недостатком является то, что он не будет работать с указателями.

+0

Прошу прощения, я все еще не знаю, как это сделать, не могли бы вы дать мне более подробную информацию? Спасибо –

+0

@TangLaoya см. Обновленное изменение для того, как может выглядеть объявление вашей функции. – vsoftco

+0

Большое спасибо. Я изменил, как вы сказали, но теперь ошибка: Ошибка ошибка C2782: 'void Kratos :: Modeler :: SetProperties (Kratos :: Modeler :: IndexType, const Kratos :: Variable &, const TDataType &)' : параметр шаблона «TDataType» неоднозначен –