2010-10-23 59 views
3

我可以調用從靜態成員函數的非靜態成員函數模板,其中定義被分成頭和CPP:C++中的非成員靜態模板方法定義?

// zero.cpp 

class Zero 
{ 
    static void zero() { one(5); } 
}; 

// one.h 

template <typename T> 
static void one(T& var); 

// one.cpp 

template <typename T> 
void one(T& var) { } 

// main.cpp 

... 

Zero::zero() 

... 

我在得到這個鏈接的問題,我不斷收到未定義參考我試圖在one.cpp中定義的函數。

最初我以爲這是由於命名空間問題,但所有文件現在都在相同的命名空間。我在這裏做什麼根本錯誤?

+0

這是一個重複百萬次以上,但是在實際發現事物時太糟糕了。愚蠢的SO搜索。 – GManNickG 2010-10-23 20:10:45

回答

4

模板定義需要在實例化時可見。也就是說,它需要以某種方式在標題中:

// one.hpp 

template <typename T> 
static void one(T& var) 
{ 
    // definition visible in header 
} 

雖然我不確定爲什麼你希望它是靜態的。

+0

當然是的,我總是對此感到困惑。如果定義在其他頭文件中仍然可用,我可以在一個頭文件中轉發聲明模板函數。你說得對,沒有理由在這種情況下是靜態的。 – Dan 2010-10-23 20:42:55

2

作爲GMan回答的一個補充,我想指出的是,您不能讓T&綁定到一個右值,例如類型爲int的整數字面值5。 5不會與int&綁定,但會綁定到const int&