c++模板自定义警告

c++ template custom warning

本文关键字:警告 自定义 c++      更新时间:2023-10-16

我正在使用c++ 11,我有一些代码相当于

template<typename T1, typename T2>
auto add_func( const T1& lhs, const T2& rhs )
{
    return lhs + rhs;
}

当我把floatint分别作为T1T2编译这段代码时,我得到警告,提到转换可能会导致一些数据丢失,这是很自然的。

我的问题是,这个警告的每个实例都指向return lhs + rhs;行,这使得警告几乎毫无用处。

是否有一种方法(理想情况下是一种可移植的方法)在调用函数而不是在模板内重新抛出这些警告?

我正在使用Visual Studio 2012,但更可取的是可移植的方式

编辑:

更清楚:我知道这个警告是正确的,是由这个代码的误用引起的,问题是我希望编译器为我找到这样一个误用的地方。现在,如果出现这个警告,我必须手动验证每个对add_func的调用,这对我来说似乎不是很可维护。

对我来说,连接到编译器的警告系统似乎是不可能的。相反,我们似乎只需要找到有关警告的更多信息。

我假设您正在Visual Studio内部构建。如果是这样,从"错误列表"切换到"输出"窗口,您应该看到如下内容:

1>add_fun.cpp(31): warning C4244: 'return' : conversion from 'const float' to 'int', possible loss of data
1>          add_fun.cpp(38) : see reference to function template instantiation 'T1 add_func<int,float>(const T1 &,const T2 &)' being compiled
1>          with
1>          [
1>              T1=int,
1>              T2=float
1>          ]

这里的操作行是"add_fun.cpp(38):参见函数模板实例化的参考",它告诉你模板在哪里被实例化。

这是Visual c++特有的,但大多数编译器应该在完整的错误测试中包含类似的信息。

恐怕没有简单的方法来解决你的问题。对于使用c++模板元编程的一代开发人员来说,这个问题是真正的痛苦。例如,当为标准算法生成警告时,您可以在STL的核心部分看到完全相同的警告。

但是正如c45207正确提到的,人们仍然可以找到警告的来源,因为实际的调用行是在编译器的输出中指定的。我相信c++开发人员在使用模板时应该熟悉这个