1

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): 首先定义在这里

我该如何解决这个问题?

4

1 回答 1

2

您需要实例化您的函数,而不是专门化它:

#include "foo.h"
#include "foo.cpp"

template int Foo::aMemberFunc<A>(int,int,int);
template int Foo::aMemberFunc<B>(int,int,int);
于 2012-10-24T23:32:39.907 回答