模板链接器错误的显式实例化
Explicit instanciation of template linker error
我正在寻求你的帮助,因为我正在使用模板,我好像误解了什么。
这是我的代码:
arbre.h
template<typename T>
class Arbre;
template<typename T>
class Noeud
{
friend class Arbre<T>;
public :
Noeud();
~Noeud();
T get_info()const;
private :
T info;
Noeud<T> *fg, *fd;
};
template<typename T>
class Arbre
{
public :
//Constructors-------------------------------------------------------------
Arbre();
/*
other function definitions
*/
}
arbre.tpp
#include "arbre.h"
template <typename T>
Noeud<T>::Noeud(){
fg = fd = 0;
}
template <typename T>
Noeud<T>::~Noeud(){
}
template <typename T>
T Noeud<T>::get_info()const{
return info;
}
template <typename T>
Arbre<T>::Arbre(){
racine = 0;
}
/*
other function implementations...
*/
main.cpp 包含 "arbre.h" 并创建一个 object,如下所示:
Arbre<int> a;
因此请关注这篇关于显式实例化的文章:http://www.cplusplus.com/forum/articles/14272/
我在 arbre.tpp 末尾添加了这两行:
template class Noeud<int>;
template class Arbre<int>;
这样链接器就可以在 arbre.o 中为我的 object 的 int 版本编译代码,这样我就可以将实现 (arbre.tpp) 与 header (arbre.h)。我的代码使用隐式实例化(arbre.tpp 包含在 header.h 末尾)但我想将它们分开。
我想知道为什么链接失败:
g++ -o main.o -c main.cpp -Wall -g -std=c++11
g++ -o arbre.o -c arbre.tpp -Wall -g -std=c++11
g++: warning: arbre.tpp: linker input file unused because linking not done
g++ -o arbre.out main.o arbre.o
g++: error: arbre.o: No such file or directory
Makefile:9: recipe for target 'arbre.out' failed
make: *** [arbre.out] Error 1
你有什么想法吗?我正在做与我链接的文章中相同的事情,不是吗?
提前致谢。
显式实例化定义是不够的。一般来说,编译器应该假定主要模板定义就是它所看到的全部。所以对它来说,那些专业化依赖于未定义的成员。
但是,存在显式实例化声明的概念。它告诉编译器在别处寻找模板定义。只需将这两个添加到 header:
的底部
extern template class Noeud<int>;
extern template class Arbre<int>;
由于您使用的是非标准扩展,.tpp
,您可能想告诉编译器您正在使用 C++ 代码,g++ -x c++
。
有模板定义的文件不能单独编译link。只需尝试以下操作:-
在你的 main.ccp 文件的顶部包含 "arbre.tpp" 作为头文件,并且只编译 main.cpp 文件并生成 exe。
在你的main.cpp
#include"arbre.tpp"
$g++ main.cpp -o test
$./test (to run the application)
我正在寻求你的帮助,因为我正在使用模板,我好像误解了什么。
这是我的代码:
arbre.h
template<typename T>
class Arbre;
template<typename T>
class Noeud
{
friend class Arbre<T>;
public :
Noeud();
~Noeud();
T get_info()const;
private :
T info;
Noeud<T> *fg, *fd;
};
template<typename T>
class Arbre
{
public :
//Constructors-------------------------------------------------------------
Arbre();
/*
other function definitions
*/
}
arbre.tpp
#include "arbre.h"
template <typename T>
Noeud<T>::Noeud(){
fg = fd = 0;
}
template <typename T>
Noeud<T>::~Noeud(){
}
template <typename T>
T Noeud<T>::get_info()const{
return info;
}
template <typename T>
Arbre<T>::Arbre(){
racine = 0;
}
/*
other function implementations...
*/
main.cpp 包含 "arbre.h" 并创建一个 object,如下所示:
Arbre<int> a;
因此请关注这篇关于显式实例化的文章:http://www.cplusplus.com/forum/articles/14272/
我在 arbre.tpp 末尾添加了这两行:
template class Noeud<int>;
template class Arbre<int>;
这样链接器就可以在 arbre.o 中为我的 object 的 int 版本编译代码,这样我就可以将实现 (arbre.tpp) 与 header (arbre.h)。我的代码使用隐式实例化(arbre.tpp 包含在 header.h 末尾)但我想将它们分开。
我想知道为什么链接失败:
g++ -o main.o -c main.cpp -Wall -g -std=c++11
g++ -o arbre.o -c arbre.tpp -Wall -g -std=c++11
g++: warning: arbre.tpp: linker input file unused because linking not done
g++ -o arbre.out main.o arbre.o
g++: error: arbre.o: No such file or directory
Makefile:9: recipe for target 'arbre.out' failed
make: *** [arbre.out] Error 1
你有什么想法吗?我正在做与我链接的文章中相同的事情,不是吗?
提前致谢。
显式实例化定义是不够的。一般来说,编译器应该假定主要模板定义就是它所看到的全部。所以对它来说,那些专业化依赖于未定义的成员。
但是,存在显式实例化声明的概念。它告诉编译器在别处寻找模板定义。只需将这两个添加到 header:
的底部extern template class Noeud<int>;
extern template class Arbre<int>;
由于您使用的是非标准扩展,.tpp
,您可能想告诉编译器您正在使用 C++ 代码,g++ -x c++
。
有模板定义的文件不能单独编译link。只需尝试以下操作:-
在你的 main.ccp 文件的顶部包含 "arbre.tpp" 作为头文件,并且只编译 main.cpp 文件并生成 exe。
在你的main.cpp
#include"arbre.tpp"
$g++ main.cpp -o test
$./test (to run the application)