2011-09-16 91 views
1

以下C++代碼使用typeid打印出來的運行時類的參數的:在模板方法中使用typeid時,如何擺脫C4100警告?

#include <iostream> 

class Foo 
{ 
}; 

class Bar: public Foo 
{ 
}; 

template <class O> void printTypeName(O& object) 
{ 
    std::cout << typeid(object).name(); 
} 

int main(void) 
{ 
    Bar x; 
    printTypeName(x); 
} 

由於Foo不是多態的,VS C++不使用該對象來確定的類型信息,並提出

C4100警告(「未引用的形式參數」)。

有沒有什麼辦法擺脫這個警告,同時保留用一個簡單的方法調用打印出對象類型的可能性?我寧願不必禁用警告。

+0

[工程在克細++](http://www.ideone.com/yDKIq)。 – iammilind

+0

我認爲,如果將'typeid'應用於非多態類型,那麼該警告是一種很好且容易獲得診斷的方法。嘗試添加一個虛擬析構函數到'Foo'。 MSVC可能會忽略警告。 –

+0

@Johannes將'typeid'應用於非多態類型時出了什麼問題? –

回答

0

有一個UNREFERENCED_PARAMETER宏,你可以使用它。

==== 編着OP:一個也可以使用

(void) object;

,並避免使用宏(學分戴維·羅德里格斯,他對此評論)。

+2

或者,標準方法是:'(void)object;'不依賴於在某處定義的宏。 –

+0

爲什麼要添加'(void)'? –

+0

@quant_dev:這應該是一種壓制潛在「聲明無效」警告的方法。 – UncleBens

2

您可以使用

#pragma warning(disable : 4100) 
//.. stuff 
#pragma warning(default : 4100) 

當你完成再次打開警告關閉,然後。

+0

我知道;-)有沒有更殘酷的方式? –

+0

使用'default'不是最好的主意 - http://stackoverflow.com/q/4193476 – sharptooth

+0

@sharptooth:這個問題絕對沒有任何理由爲已發佈的答案。 – Puppy

-1

這個工作對我來說沒有任何錯誤:

template <typename T> 
void prn(const T&){ 
    std::cout << typeid(T).name() << std::endl; 
} 
+0

雖然我會失去多態的類型信息。 –