2011-09-16 54 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

虽然我会失去多态的类型信息。 –