C++成员模板函数,遇到个问题编译无法通过

2016-09-11 23:25:22 +08:00
 xss

先看能编译通过的例子,如下在同一个文件 a.cpp 中:

class A{
    public:
        template <typename T> void r(T& t){}
};

int main(){
    A objA;
    int i = 1;
    objA.r(i);
}

上面的例子使用 g++ a.cpp -o a 是可以编译通过的.

现在,把 class A 拆分成.h 文件和.cpp 文件:

a.h :

class A{
    public :
        template <typename T> void r(T&);
};

a.cpp :

#include "a.h"
template <typename T> void A::r(T& t){}

m.cpp :

#include "a.h"
int main(){
    A objA;
    int i = 1;
    objA.r(i);
}

然后编译:

g++ -c a.cpp -o a.o

g++ -c main.cpp -o main.o

g++ a.o main.o -o final

然后竟然报错了,说是 undefined void A::r<int>(int&)

这是什么鬼,求解答.

1941 次点击
所在节点    问与答
6 条回复
lifanxi
2016-09-11 23:36:59 +08:00
现在的 g++还不能支持模板这么拆开写。需要把模板的声明和定义都写到头文件中。
yangff
2016-09-11 23:50:32 +08:00
从原理上来说吧,

g++ -c main.cpp -o main.o 的时候, g++只能看到 A::r 的声明,而看不到定义,所以这个符号是没有编译进去的
编译 g++ -c a.cpp -o a.o 的时候, g++看不到对 A::r 的展开方式,所以相当于什么都没有编译

g++ a.o main.o -o final 的时候, main.o 要的符号, a.o 里就没有。

以及, g++扫依赖是有顺序的,虽然和这个无关了
skydiver
2016-09-11 23:52:54 +08:00
模版类和方法的实现都要放在头文件里。
skydiver
2016-09-11 23:53:12 +08:00
多看看书吧少年…
sfqtsh
2016-09-11 23:57:03 +08:00
你这问题《深入实践 C++模板编程》 1.3.1 节有讲~~
messXD
2016-09-12 14:35:44 +08:00
模版类的实现要放在头文件里。毕竟是模版,后面还要实例化。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/305538

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX