1

我有以下主程序,编译时出现此错误: Undefined symbols for double squarer(double, SineFunctor&) 为什么链接器找不到函数 squarer?

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;
}
4

2 回答 2

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. 带有双下划线的名称保留供实现使用。

于 2013-05-01T22:22:36.750 回答
0

模板函数要么需要位于标头中,要么需要为 cpp 中的所有类型实例化。

于 2013-05-01T22:23:10.503 回答