将错误与模板类链接

时间:2012-04-11 09:13:10

标签: c++ templates g++ function-pointers functor

我有一个类需要在各种不同的上下文中调用外部函数。我想保持灵活性,所以我使用的界面(灵感来自第三版的数字食谱)应该与仿函数,函数指针等一起使用。一个简化的例子如下:

class MyClass {
  public:
    template <class T>
    MyClass(T &f_) { f = f_; }
  private:
    int (*f)(int);
};

int myFn(int i) {
  return i % 100;
}

int main() {
  MyClass test(myFn);
  return 0;
}

到目前为止一切顺利; g ++编译时没有任何抱怨。在我的实际应用程序中,有更多的代码,所以我把事情分成了多个文件。例如,

test2.h:

#ifndef __test2__
#define __test2__

class MyClass {
  public:
    template <class T>
    MyClass(T &f_);    
 private:
    int (*f)(int);
};

#endif

测试2.cpp:

#include "test2.h"

template <class T>
MyClass::MyClass(T &f_) {
  f = f_;
}

main.cpp中:

#include "test2.h"

int myFn(int i) {
  return i % 100;
}

int main() {
  MyClass test(myFn);
  return 0;
}

当我尝试使用g++ test2.cpp main.cpp编译时,我收到以下链接错误:

/tmp/ccX02soo.o: In function 'main':
main.cpp:(.text+0x43): undefined reference to `MyClass::MyClass<int ()(int)>(int (&)(int))'
collect2: ld returned 1 exit status

似乎g ++没有意识到我也在尝试编译test2.cpp。关于这里可能会发生什么的任何想法?

谢谢,

- 克雷格

1 个答案:

答案 0 :(得分:1)

模板类必须让所有使用它们的翻译单元都能看到它们的实现,除非它们是完全专用的。

这意味着你必须在标题中移动实现:

//test2.h
#ifndef __test2__
#define __test2__

class MyClass {
  public:
    template <class T>
    MyClass(T &f_);    
 private:
    int (*f)(int);
};

template <class T>
MyClass::MyClass(T &f_) {
  f = f_;
}

#endif