2015-11-09 5 views
0

у меня есть тип параметров, какшаблона конкретизация проблема со сложными типами данных

typedef double DP; 
typedef const NRVec<DP> Vec_I_DP; //NRVec is a parametrized template class. 
typedef NRVec<DP> Vec_DP, Vec_O_DP, Vec_IO_DP; 

xa -> Vec_I_DP(30) 
ya -> Vec_I_DP(30) 
yp1 -> DP(30) 
ypn -> DP(30) 
y2 -> Vec_O_DP(30) 

вызов моей функции является

NR::spline(xa,   ya,   yp1,   ypn,   y2); 

И функция декларация

void spline(Vec_I_DP &x, Vec_I_DP &y, const DP yp1, const DP ypn,Vec_O_DP &y2); 

Может кто-нибудь сказать меня, почему я получаю следующую ошибку.

1>Hiwi.obj : error LNK2019: unresolved external symbol "void __cdecl NR::spline(class NRVec<double> const &,class NRVec<double> const &,double,double,class NRVec<double> &)" ([email protected]@@[email protected]@@[email protected]@Z) referenced in function "void __cdecl smooth_Line(double *,int *,int,int,double *,double *,int,int)" ([email protected]@[email protected]) 
+0

Каковы макросы Vec_I_DP и Vec_O_DP? –

+0

Проблема, похоже, связана с привязкой, а не с экземпляром шаблона. Вы определили функцию «NR :: spline»? Вы включили файл, в котором функция определена в файле project/makefile? –

+2

Где определена функция? Вы связываетесь с ним? Пожалуйста, проверьте это: [Что такое неопределенная ссылка/неразрешенная внешняя ошибка символа и как ее исправить?] (Http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external -symbol-error-and-how-do-i-fix) – NathanOliver

ответ

0

Кажется, вы используете NR2. Новейшая версия - NR3, которая определяет сплайн в классе с именем Spline_interp. Вы должны использовать NR3. В этом случае я покажу вам пример использования вышеупомянутого класса. Допустим, у вас есть пять значений для sin(x), и вы можете интерполировать эти значения и получить интерполированные значения, скажем sin(x=.25). В этом примере мы знаем истинное значение, поэтому мы можем сравнить результат с интерполированным значением. В следующем коде я получил интерполированное значение плюс ошибка.

#include <iostream> 
#include <iomanip> 
#include "nr3.h" 
#include "interp_1d.h" 

int main() { 
    VecDoub x(5), y(5); 

    //x = 0:0.3:1 
    //y = sin(x) 

    x[0] = 0.0; 
    x[1] = 0.3; 
    x[2] = 0.6; 
    x[3] = 0.9; 

    y[0] = 0.0; 
    y[1] = 0.2955; 
    y[2] = 0.5646; 
    y[3] = 0.7833; 

    /************************************************** 
     3.3 Cubic Spline Interpolation 
     page(120) 
    ***************************************************/ 

    Spline_interp myfunc3(x,y); 
    std::cout << "Cubic Spline Interpolation: " << std::endl; 
    std::cout << "interp value: " << myfunc3.interp(.25) << "\n" 
       << " true value: " << sin(0.25)   << "\n" 
       << "  error: " << ((sin(0.25) - myfunc3.interp(.25))/sin(0.25))*100.0 << "%" << std::endl; 


    std::cout << std::setw(25) << std::cout.fill('=') << std::endl; 


    return 0; 
} 

Для компиляции в ОС Windows из командной строки,

cl /EHsc main.cpp /Fetest.exe /I path\to\NR\code 

В результате

Cubic Spline Interpolation: 
interp value: 0.247187 
    true value: 0.247404 
     error: 0.0876794% 
======================== 

ошибка очень мала.

+0

Если вы действительно хотите использовать NR2, сообщите мне, чтобы я мог опубликовать ответ по этому вопросу, однако я настоятельно рекомендую вам использовать NR3 – CroCo

Смежные вопросы