2017-07-24 25 views
0

我想將任何類型的參數傳遞給我的函數func1()。 因此,這裏是我的代碼: myclass.h通過任何類型的參數在C++中使用模板功能

public: 
    myclass(); 
    template<typename T> void func1(T object); 

myclass.cpp

template<typename T> 
void myclass::func1(T object) 
{ 
    return; 
} 

main.cpp中

int a=0; 
myclass::func1<int>(a); 

但我得到此錯誤:

error: cannot call member function 'void myclass::func1(T) [with T = int]' without object 

我的錯誤在哪裏?

+3

的成員函數仍是一個成員函數,即使它是一個模板。這意味着你需要一個*對象*來調用它。 –

+1

如果您之前沒有使用過模板,那麼您可能會發現[此問題及其答案信息](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-的報頭文件)。 –

+1

你也不應該指定模板類型。您應該讓模板參數推演適用於您。 – NathanOliver

回答

4

您不能簡單地將模板函數中的聲明和定義分開。對模板函數最簡單的做法是在頭文件的函數聲明中提供代碼體。

如果您想調用沒有類對象的函數,請將靜態添加到函數簽名中。

header.hpp

#include <iostream> 

class test_class{ 
public: 
    template<typename T> static void member_function(T t){ 
     std::cout << "Argument: " << t << std::endl; 
    } 

}; 

的main.cpp

#include <iostream> 

#include "header.hpp" 

int main(int argc, char ** argv){ 

    test_class::member_function(1); 
    test_class::member_function("hello"); 
} 
+0

謝謝!它的工作原理,但我想知道模板函數中的聲明和定義分開簡單的例子。如果這是不可能的,那麼我會接受你的答案。 –

+1

@ lord.h我不認爲這是可能的,但我不是專家。您可以通過在頭文件和源文件中聲明和定義來「欺騙」編譯器,然後將源文件包含在頭文件的末尾。我不認爲我可以從已經存在的答案中更好地解釋。 https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file –