2016-01-20 62 views
0

我試圖使一個單(鹼)類:C++:Singleton類模板導致鏈接錯誤?

template<typename SUBCLASS> 
class Singleton { 
public: 
    static SUBCLASS& get_instance() { 
     static SUBCLASS instance; 
     return instance; 
    } 
}; 

此單例類是在頭文件中,其可以通過任何其他文件被包括在內。例如。一類可能是這樣的:

class MyClass : public Singleton<MyClass> { 
public: 
... 
private: 
    MyClass() { 
    } 

    friend Singleton<MyClass>; 
} 

別的地方MyClass可以這樣使用:

MyClass& instance = MyClass::get_instance(); 

好點:編譯工作。 壞點:鏈接失敗。

的錯誤信息是:

undefined reference to `MyClass::get_instance()' 

我該怎麼辦錯了嗎?有沒有人提示?

感謝youvery多

問候

凱文

+0

你使用什麼編譯器?它適用於我在Visual Studio 2013中。 – Sam

+0

對我來說,這個代碼編譯和鏈接,除了MyClass :: MyClass()之外沒有任何問題需要公開。所有源文件都是構建的一部分嗎?這個類是屬於一個monolith可執行文件還是轉移到一個庫? – dmi

回答

1

可以使用using關鍵字:

class MyClass : public Singleton<MyClass> { 
public: 
    using Singleton<MyClass>::get_instance; 
... 
private: 
    MyClass() { 
    } 

    friend Singleton<MyClass>; 
} 

這拉動作用在進MyClass範圍。

+0

這工作:)謝謝! –

+0

這是需要的,因爲'get_istance'是靜態的嗎? – bolov

+0

@bolov是的,因爲它是靜態的,它不是「繼承的」,它總是在基類中是靜態的。 –

1

在編譯時,可以省略未引用的靜態方法。您可以通過在同一個編譯單元中引用該方法或通過更改特定於編譯器的優化設置來解決此問題。

另一種方式可能是顯式實例化模板,像這樣:

template class Singleton<MyClass>; 
1

我編譯罰款。

#include <iostream> 

template<typename SUBCLASS> 
class Singleton { 
public: 
    static SUBCLASS& get_instance() { 
     static SUBCLASS instance; 
     return instance; 
    } 
}; 

class MyClass : public Singleton<MyClass> { 
public: 

private: 
    MyClass() { 
    } 

    friend Singleton<MyClass>; 
}; 

int main() 
{ 
    using namespace std; 
    MyClass& a = MyClass::get_instance(); 
    return 0; 
} 

編譯:

c++ singleton.cpp

+0

我使用每個類(也是主)一個單獨的編譯單元,可能這會導致問題。 –