2017-09-04 86 views
1

編輯:這是不是標準模板問題的副本。在模板類中,如何定義具有不同類型名稱的函數

我的場景涉及模板類和類蒙山一個參數是模板的成員函數,而不是同類型的類。

即使當我把定義中的標頭,我仍然無法找到正確的語法。

有人可以幫助我與我的具體問題?


我過於簡單的代碼:

了foo.h:

template<typename T1> 
class Foo { 
public: 
    template<typename T2> 
    static void bar(vector<T1>& a, vector<T2>& b); 
}; 

Foo.cpp中:

#include <Foo.h> 

template<typename T1> 
template<typename T2> 
void Foo<T1>::bar(vector<T1>& a, vector<T2>& b) { 
    //code logic 
} 

Goo.cpp:

#include <Foo.h> 

int main(int argc, char** argv) { 
    vector<int> a; 
    vector<double> b; 
    Foo<int>::bar(a, b); 
} 

我的錯誤:

undefined reference to 
void Foo<int>::bar<double>(std::vector<int, std::allocator<int> >&, 
std::vector<double, std::allocator<double> >&) 

我找不到合適的方式來定義的模板。

我也注意到,typenames的順序將改變錯誤(也把整個函數在類聲明)。

什麼是正確的語法?

+0

爲什麼你認爲這是不是重複?你不能在源文件中定義模板。 「即使我把這個定義放在標題中,我仍然找不到正確的語法。」 ...那你爲什麼不用頭部中的定義顯示代碼? – user463035818

+0

如果你[編輯]這個問題向我們展示了在頭文件中定義的模板成員函數的代碼,我們可以重新打開它。用於簡化代碼的榮譽 - 確保編輯後的簡化版本仍然失敗,幷包含錯誤消息。 (如果你在評論中提到我,我想我可以單獨重新打開它。) –

+0

你的Foo.h有一個錯字和一個缺失的分號。請僅複製並粘貼實際嘗試編譯的代碼,並驗證是否收到聲明的錯誤消息。 – aschepler

回答

1

你的問題不是在聲明或定義。問題是定義和聲明的分裂。這不符合你的工作方式。在編譯foo.cpp時,您的模板的任何用途都不可見,因此不會創建任何實例。編譯goo.cpp時,鏈接程序將無法鏈接到它們。

那是什麼這個錯誤是指:

undefined reference to 'void Foo<int>::bar<double>(std::vector<int, std::allocator<int> >&, std::vector<double, std::allocator<double> >&)'

如果你真的想這樣做,你在做什麼,你需要使用顯式實例的類型的每個組合。

變化foo.cpp這個(注意顯式實例定義中的最後一行):

template<typename T1> 
template<typename T2> 
void Foo<T1>::bar(std::vector<T1>& a, std::vector<T2>& b) { 
    //code logic 
} 

template void Foo<int>::bar(std::vector<int>&, std::vector<double>&); 
相關問題