2015-11-05 207 views
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

+0

您是如何編制的一切錯誤?我無法複製。 – Barry

+0

我正在使用Xcode 5 – brahmin

+1

僅供參考,LLVM 5.1是Apple的版本控制版本,實際上是[LLVM 3.4](https://en.wikipedia.org/wiki/Xcode#Toolchain_versions)。嘗試更新版本的LLVM,因爲它可能是一箇舊的錯誤。 – Cornstalks

回答

1

解決方案在評論中給出鏘的錯誤:它是鏘3.4