c ++模板自定义警告

时间:2013-05-21 22:16:16

标签: c++ templates c++11 warnings

我正在使用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的每次调用,这对我来说似乎不太可维护。

我希望现在更有意义

2 个答案:

答案 0 :(得分:2)

对我来说,加入编译器的警告系统似乎不是一件好事。相反,似乎我们只需要找到有关警告的更多信息。

我假设您正在构建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 ++的,但大多数编译器应在完整的错误测试中包含类似的信息。

答案 1 :(得分:2)

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

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