【问题标题】:g++ compiler option to warn about type conversions with ublas::bounded_vector使用 ublas::bounded_vector 警告类型转换的 g++ 编译器选项
【发布时间】:2012-03-22 11:45:32
【问题描述】:

考虑以下代码:

#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 或任何其他选项都没有这样做。

【问题讨论】:

    标签: c++ boost type-conversion implicit-conversion boost-ublas


    【解决方案1】:

    为什么任何编译器都应该对此发出警告?

    ublas::bounded_vector&lt;T,N&gt; 的作者必须定义了从ublas::bounded_vector&lt;U,N&gt; 的转换,否则根本不可能。如果有这样的函数/构造函数,编译器就没有理由在你使用它时警告你。

    【讨论】:

    • 我的代码中有一个错误正是由这个问题引起的。收到这将是一个有用的警告,因为这是一件很难注意到的事情,如果编译器发出警告,我会立即注意到它。如果无法从编译器获得警告消息,是否有另一种方法可以捕获这种类型的错误?我正在处理相当大的代码,因此单独浏览所有文件是不切实际的。
    • @mk527:如前所述,世界上没有编译器可以给你一个警告。为此,编译器需要查看您的头脑以了解您的意图;)但除此之外,我认为没有干净的 C++ 解决方案,除了编写一个将向量作为私有成员并公开的代理只有你真正需要的。
    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多