c++模板自定义警告
c++ template custom warning
我正在使用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
的调用,这对我来说似乎不是很可维护。
对我来说,连接到编译器的警告系统似乎是不可能的。相反,我们似乎只需要找到有关警告的更多信息。
我假设您正在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++开发人员在使用模板时应该熟悉这个
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 如何正确实现和访问运算符的各种自定义枚举器
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 自定义先决条件对移动分配运算符有效吗
- 使用VS Code和CMake Tools运行自定义命令
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- std::ranges::elements_view,用于自定义类似元组的数据
- 跟随整数索引列表的自定义类迭代器
- 参数化自定义CMake工具链
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- C++ 添加编译器警告,以错误使用自定义打印/日志功能
- 有没有办法自定义编译错误/警告消息
- c++模板自定义警告
- 防止或生成自定义弃用的警告
- 创建自定义std流实现时的编译器警告
- C++自定义字符串修剪实现valgrind警告