我正在使用C ++ 11,我有一些相当于
的代码template<typename T1, typename T2>
auto add_func( const T1& lhs, const T2& rhs )
{
return lhs + rhs;
}
当我分别使用float
和int
编译此代码作为T1
和T2
时,我会收到警告,提到转换可能会导致数据丢失,这很自然
我的问题是,此警告的每个实例都会指向行return lhs + rhs;
,这使警告几乎无用。
有没有办法(理想情况下是一种可移植的方式)在调用函数而不是模板内部重新抛出这些警告?
我正在使用Visual Studio 2012,但最好采用便携式方式
编辑:
更清楚:我知道这个警告是正确的并且是由于滥用此代码引起的,问题是我希望编译器能够找到这样一个误用的地方。现在,如果出现此警告,我必须手动验证对add_func
的每次调用,这对我来说似乎不太可维护。
我希望现在更有意义
答案 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)