test.h
#ifndef TEST_H_ #define TEST_H_ template<typename T> void test(T t); #include "test.cpp" #endif
test.cpp
#include "test.h"
#include <iostream>
template<typename T>
void test(T t)
{
std::cout << "it's a template test.." << std::endl;
}
main.cpp
#include "test.h"
int main()
{
test(1);
return 0;
}
Makefile
srcs=$(wildcard *.cpp)
objs=$(patsubst %.cpp, %.o, $(srcs))
$(info $(srcs))
$(info $(objs))
all:main
main:$(objs)
g++ -o $@ $^
%.o:%.cpp
g++ -c $&amp;amp;lt;
.PHONY:clean
clean:
rm -f *.o
编译结果:
test.cpp main.cpp
test.o main.o
g++ -c test.cpp
test.cpp:8:6: error: redefinition of 'template<class T> void test(T)'
void test(T t)
^~~~
In file included from test.h:7,
from test.cpp:4:
test.cpp:8:6: note: 'template<class T> void test(T)' previously declared here
void test(T t)
^~~~
make: *** [Makefile:10: test.o] Error 1
修改test.cpp增加条件编译
#ifndef TEST_CPP_
#define TEST_CPP_
#include "test.h"
#include <iostream>
template<typename T>
void test(T t)
{
std::cout << "it's a template test.." << std::endl;
}
#endif
编译结果:
test.cpp main.cpp
test.o main.o
g++ -c test.cpp
g++ -c main.cpp
g++ -o main test.o main.o
编译成功
运行结果:
./main
it's a template test..
如果模板特化,需要将特化函数声明为内联,否则编译也会报错
main.cpp:(.text+0x0): multiple definition of `void test<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'; test.o:test.cpp:(.text+0x0): first defined here
test.h
#ifndef TEST_H_ #define TEST_H_ #include <string> template <typename T> void test(T t); template<> inline void test<std::string>(std::string s); #include "test.cpp" #endif
test.cpp
#include "test.h"
#include <iostream>
template<typename T>
void test(T t)
{
std::cout << "it's a template test.." << std::endl;
}
template<>
void test<std::string>(std::string s)
{
std::cout << "it's a template special test.." << std::endl;
}
main.cpp
#include "test.h"
int main()
{
test(1);
test(std::string("1"));
return 0;
}
运行结果:
./main
it's a template test..
it's a template special test..
参考:
C++学习笔记 模板 包含编译模式 分别编译模式
Makefile简单编写实例
 
包含编译模板:等您坐沙发呢!