假设我声明了一个模板A
类a.h
#include <iostream>
template<bool b>
class A {
public:
void print(std::ostream& out);
};
并在中定义 print 方法(使用anda.cpp
的显式实例化)true
false
#include "a.h"
template<bool b>
void A<b>::print(std::ostream& out) {
out << "A" << b;
}
template class A<true>;
template class A<false>;
一个示例主程序main.cpp
可以是
#include "a.h"
int main() {
A<true> a;
a.print(std::cout);
}
上面的小项目编译得很好。
问题:如果我将显式实例化置于print
方法定义之上(in 中a.cpp
),代码将不再编译,并出现通常的undefined reference to A<true>::print(...)
错误。
#include "a.h"
template class A<true>;
template class A<false>;
template<bool b>
void A<b>::print(std::ostream& out) {
out << "A" << b;
}
为什么会这样?
编辑:要编译的 Makefile
main : main.o a.o
g++ main.o a.o -o main
main.o : main.cpp
g++ -c main.cpp
a.o : a.cpp
g++ -c a.cpp