2013-05-01 77 views
1

我有以下的主程序,它在編譯時給出了這樣的錯誤:雙開方機(雙,SineFunctor &) 爲什麼不能鏈接器找到函數平方 未定義的符號?C++編譯算符錯誤

include <iostream> 
#include "SineFunctor.h" 
#include "squarer.h" 
int main() 
{ 
    const double PI = 3.141592L; 
    double x = 1.0; 
    double y; 
    // initialize function parameters 
    SineFunctor sine(2., 10.*PI, 0.);  
    // pass functions sine to function squarer 
    y = squarer(x, sine); 
    return 0; 
} 

這裏是SineFunctor

// SineFunctor.h 
#ifndef __functor_example__SineFunctor__ 
#define __functor_example__SineFunctor__ 

#include <iostream> 
class SineFunctor {  
public: 
// constructor to set function parameters 
SineFunctor(const double amp, const double freq, const double phase); 

// function evaluation using overloaded operator() 
double operator() (const double t); 
private: 
    double _amp; 
    double _freq; 
    double _phase; 
}; 
#endif /* defined(__functor_example__SineFunctor__) */ 

// SineFunctor.cpp 
#include <cmath> 
#include "SineFunctor.h" 

// constructor to set function parameters 
SineFunctor::SineFunctor(const double amp, const double freq, const double phase) { 
    _amp = amp; 
    _freq = freq; 
    _phase = phase; 
} 
// function evaluation using overloaded operator() 
double SineFunctor::operator() (const double t) { 
    return _amp * sin(_freq * t + _phase); 
} 

文件和平方>

// squarer.h 
#ifndef __functor_example__squarer__ 
#define __functor_example__squarer__ 

#include <iostream> 
template <class F> 
double squarer(const double x, F& func); 

#endif /* defined(__functor_example__squarer__) */ 

// squarer.cpp 
#include "squarer.h" 

template <class F> 
double squarer(const double x, F& func) { 
    double y = func(x); 
    return y * y; 
} 
+0

可能的重複[爲什麼模板只能在頭文件中實現?](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-文件) – 2013-05-01 22:24:00

回答

0

模板函數或者需要在頭文件中,或者爲cpp中的所有類型實例化。

1

模板定義必須在頭文件中給出,因爲編譯器需要確切地知道它應該是什麼實例化。移動的squarer定義成頭文件:

// squarer.h 
#ifndef functor_example__squarer 
#define functor_example__squarer 

template <class F> 
double squarer(const double x, F& func) { 
    double y = func(x); 
    return y * y; 
} 

#endif 

注意,我從你的#define刪除雙下劃線。帶有雙下劃線的名稱保留供實施使用。

+0

或者在定義它們的編譯單元中爲所有類型實例化。 – 2013-05-01 22:25:07