2012-10-24 25 views
2

考慮下面的代碼:爲什麼G ++不會爲模板方法產生警告而不返回任何內容?

template <typename T> 
class C2 { 
    public: 
      T method() { } 
      int method2() { } 
}; 

g++ -Wall -c -pedantic編譯它給了我以下警告:

test.cpp: In member function ‘int C2<T>::method2()’: test.cpp:4:29: warning: no return statement in function returning non-void [-Wreturn-type]

這是預期。奇怪的是method()也沒有返回任何東西。爲什麼不會產生警告,因爲使用T = int實例化C2會使這兩種方法的調用同樣危險?

+1

你在編譯時在某處實例化了'C2'嗎? – Pubby

+0

[Works here](http://liveworkspace.org/code/3ea9d586eb0ce16cff833f15be02b0e7)。 –

+0

你真的叫過「方法」嗎?編譯器不會爲未執行的模板函數生成代碼。 –

回答

6

如果您說T = void,則不需要return聲明。

僅僅因爲你可以使用模板的方式,就是壞了並不意味着你來,和COM ­堆垛機可讓您在疑點利益。

還記得一個類模板的成員函數是只有在使用時才實例化。所以實際上的原因的錯誤是有C2<char> x; x.method();,並且確實會產生警告。

+0

有道理:如果沒有實例化,編譯器不能說它會做或者不會返回void。而且,只是實例化模板並不會給出警告,但調用方法的確如此,正如您所說的那樣。感謝您的解釋。 – Gabriel

+0

我想指出,即使沒有模板變量返回類型*,函數也不會生成*。所以,如果你不調用'x.method2()',它將不會從原始問題中產生警告。 (剛剛意識到我自己) – Xymostech

+0

嗯。在這裏,我使用g ++ 4.7.0,即使我不調用它,它也會爲'method2'生成這個警告(我測試的代碼正是我發佈的代碼,沒有添加任何內容)。 – Gabriel

1

您實際上必須調用「method」才能讓編譯器編譯它。畢竟它是一個模板函數。請參閱下面的代碼評論。

template <typename T> 
class C2 { 
    public: 
      T method() { } 
      int method2() { } 
}; 

int main() 
{ 
    C2<int> c; 
    c.method2(); 
    // If you comment out the below line, there is no warning printed. 
    c.method(); 
} 
相關問題