2013-05-01 80 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