在foo.h
:
#ifndef FOO_H
#define FOO_H
enum Rat
{
A,
B
};
class Foo
{
public:
template<Rat r>
int aMemberFunc(int, int, int);
};
#endif
在foo.cpp
:
#include "foo.h"
namespace {
template<Rat r>
int helper(int a, int b)
{
return a+b*((int) r);
}
}
template<Rat r>
int Foo::aMemberFunc(int a, int b, int c)
{
return a + helper<r>(b,c);
}
在main.cpp
:
#include "foo.h"
#include <iostream>
using namespace std;
int main(void)
{
Foo test;
cout << test.aMemberFunc<B>(1,2,3) << endl;
}
我编译g++ main.cpp foo.cpp
并得到:
main.cpp:(.text+0x88): undefined reference to `int Foo::aMemberFunc<(Rat)1>(int, int, int)'
collect2: ld returned 1 exit status
我不希望将内容移动到标题,因为这会带来帮助和很多包袱,我尝试添加一个文件fooimpl.cpp
:
#include "foo.h"
#include "foo.cpp"
template int Foo::aMemberFunc<A>(int,int,int);
template int Foo::aMemberFunc<B>(int,int,int);
然后编译g++ fooimpl.cpp main.cpp foo.cpp
这是根据 Dietmar 的建议(谢谢!),但是一旦我在上述技巧void rand();
的标题中foo.h
添加一个函数,就会产生这个错误:void rand() {}
foo.cpp
foo.cpp:(.text+0x0): `Foo::rand()' 的多重定义 /tmp/ccoCtGMk.o:fooimpl.cpp:(.text+0x0): 首先定义在这里
我该如何解决这个问题?