2017-06-30 90 views
0

我有兩個共享庫中的類。共享庫中的模板類只能使用隱式和顯式實例化

--- foo.h 
template <class T> 
class Foo 
{ 
    Foo(); 
    void doSomething(void); 
... 
}; 

--- foo.cpp 
#include "foo.h" 
#include "bar.h" 

template <class T> 
Foo:Foo() 
{ 
}; 

template <class T> 
void Foo::doSomething(void) 
{ 
}; 

// Here I put the explicit/implicit instantiations (see below) 

--- bar.h 
template <class T> 
class Bar 
{ 
... 
}; 

--- bar.cpp 
template <class T> 
class Bar 
{ 
... 
}; 

template class Bar<int>; 

和使用那些主要功能:

#include "foo.h" 
#include "bar.h" 

int main(void) 
{ 
    Foo<Bar<int> > foobar; // Or Foo<int> foobar; for version 5 
    foobar.doSomething(); 
} 

現在,爲了使這項工作我要實例富。有5種方法,我想這樣做:

版本1:顯式實例(不工作)

template class Foo<Bar<int> >; 

版本2:隱式實例光(不工作)

void dummy(void){Foo<Bar<int> > foobar;} 

版本3:隱式實例(不工作)

void dummy(void){Foo<Bar<int> > foobar; foobar.doSomething();} 

版本4:隱式和顯式實例(WO RKS)

template class Foo<Bar<int> >; 
void dummy(void){Foo<Bar<int> > foobar; foobar.doSomething();} 

5版:與非模板類(工程顯式實例)

template class Foo<int>; // Works, if you change the main as well 

爲什麼只針對Foo<Bar<int> > 4版的工作?爲什麼Foo<int>工作,但Foo<Bar<int> >不?對於不工作的我會得到'未定義參考'錯誤。代碼非常簡單,並且代碼非常簡單,但是很難將代碼分解到不再工作的地步,因爲它嵌入了一個相當複雜的項目中。我主要在這裏尋找提示,可能會導致這種情況。

+0

目前尚不清楚「不工作」到底是什麼,你在哪裏得到'未定義參考'錯誤?你不能只把模板體放到cpp中,並建立共享庫。 – VTT

+0

我得到'Foo'構造函數的未定義參考。我知道,這就是爲什麼我想使用顯式實例化,但它似乎沒有工作。 – Shadowigor

回答

0

好吧,我能弄明白。問題在於彙編順序。 Bar<int>得到了明確的實例化,但顯然這發生在Foo<Bar<int> >的明確實例化之後,它以某種方式阻止它被實例化。在同一個模塊中的template class Foo<Bar<int> >;之前添加另一個template class Bar<int>;解決了問題。

相關問題