1
考虑下面的代码:克++编译器选项以警告类型转换用的uBLAS :: bounded_vector
#include <iostream>
#include <vector>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/io.hpp>
int main()
{
namespace ublas = boost::numeric::ublas;
double d = M_PI;
unsigned u = d;
std::cout << "d = " << d << std::endl;
std::cout << "u = " << u << std::endl;
ublas::bounded_vector<double,3> dVec = ublas::scalar_vector<double>(3,M_PI);
ublas::bounded_vector<unsigned,3> uVec = dVec; // type conversion!
std::cout << "dVec = " << dVec << std::endl;
std::cout << "uVec = " << uVec << std::endl;
return 0;
}
当我编译此使用的g ++(4.6.1版本)用下列选项:
g++ -g3 -Wall -Wextra -ansi -pedantic -Wconversion -std=c++0x test.cpp -o test
我得到以下警告:
test.cpp: In function ‘int main()’:
test.cpp:11:22: warning: conversion to ‘unsigned int’ from ‘double’ may alter its value [-Wconversion]
当我运行程序我得到:
$ ./test
d = 3.14159
u = 3
dVec = [3](3.14159,3.14159,3.14159)
uVec = [3](3,3,3)
编译器为标量转换产生了一个警告,但没有关于ublas转换的警告,有没有办法让编译器在这种情况下写一个警告?它看起来像-Wconversion
或任何其他选项不这样做。
我在我的代码中有一个错误是由这个问题引起的。这将是一个有用的警告,因为如果编译器发出了一个警告,我会马上注意到它,这是一件很难注意的事情。 如果无法从编译器获得警告消息,是否有另一种方法来捕获此类错误?我正在处理相当大的代码,因此单独浏览所有文件是不现实的。 – mkm 2012-03-22 14:19:31
@ mk527:正如所说的,世界上没有编译器可以给你一个警告。为此,编译器需要查看你的脑袋以查看你的意图;)但除此之外,我认为没有干净的C++解决方案,除了编写一个将矢量保存为私有成员的代理,以及公开哪些只有你真正需要的东西。 – 2012-03-22 14:51:24