3
當試圖顯式實例化一個類時,我遇到鏈接器問題。使用C++ 11,LLVM 5.1。 這裏是一個最小的工作示例:C++模板顯式實現,模板參數是類模板
declaration.h:
template <class T>
class Box {
public :
template <class _T>
using Box_sub = Box<_T>;
};
//argument 'int N' is only used to remove ambiguity about class instantiation
template < template <class T> class Tbox, int N >
class A {
public :
A();
};
A_implementation.h:
template < template <class T> class Tbox, int N >
A<Tbox,N>::A() {}
explicit_instantiation.cpp:
#include "declaration.h"
#include "A_implementation.h"
template class A<Box,1>;
template class A<Box<int>::Box_sub,2>;
main.cpp中:
#include "declaration.h"
int main() {
A<Box,1> a1;
A<Box<int>::Box_sub,2> a2;
return 0;
}
這裏是鏈接錯誤:
Undefined symbols for architecture x86_64:
"A<Box<int>::Box_sub, 2>::A()", referenced from:
_main in main.o
貌似編譯考慮第二個顯式實例化的東西不是主要的,第二個聲明不同。我不明白爲什麼。可能是類模板被嵌入到另一個模板中的問題。
其實問題可能是緊密聯繫在一起的,好像我以前問有關動態鑄造:C++ dynamic downcasting to class template having template template parameter being a class template or an alias template
,提出了一種伎倆,但在顯式實例的情況下,我在想,如果另一個(簡單)的訣竅是可能的。
解決方案在註釋中給出的:它是3.4
您是如何編制的一切錯誤?我無法複製。 – Barry
我正在使用Xcode 5 – brahmin
僅供參考,LLVM 5.1是Apple的版本控制版本,實際上是[LLVM 3.4](https://en.wikipedia.org/wiki/Xcode#Toolchain_versions)。嘗試更新版本的LLVM,因爲它可能是一箇舊的錯誤。 – Cornstalks