1

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

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

float当我分别使用和intasT1和as编译此代码时,T2我收到警告说转换可能会导致一些数据丢失,这是很自然的。

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

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

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

编辑:

更清楚地说:我知道这个警告是正确的,并且是由滥用此代码引起的,问题是我希望编译器为我找到发生这种滥用的地方。现在,如果出现此警告,我必须手动验证每次调用add_func,这对我来说似乎不太易于维护。

我希望这现在更有意义

4

2 回答 2

2

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

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

于 2013-05-22T07:01:17.513 回答
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) : see reference to function template instantiation”,它告诉你模板在哪里被实例化。

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

于 2013-05-22T06:06:41.073 回答