2012-03-22 43 views
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或任何其他选项不这样做。

回答

0

为什么任何编译器都会对此提出警告?

ublas::bounded_vector<T,N>的作者必须定义从ublas::bounded_vector<U,N>转换,否则根本不可能。如果有这样的函数/构造函数,编译器没有理由在您使用它时提醒您。

+0

我在我的代码中有一个错误是由这个问题引起的。这将是一个有用的警告,因为如果编译器发出了一个警告,我会马上注意到它,这是一件很难注意的事情。 如果无法从编译器获得警告消息,是否有另一种方法来捕获此类错误?我正在处理相当大的代码,因此单独浏览所有文件是不现实的。 – mkm 2012-03-22 14:19:31

+0

@ mk527:正如所说的,世界上没有编译器可以给你一个警告。为此,编译器需要查看你的脑袋以查看你的意图;)但除此之外,我认为没有干净的C++解决方案,除了编写一个将矢量保存为私有成员的代理,以及公开哪些只有你真正需要的东西。 – 2012-03-22 14:51:24