2012-03-22 11 views
1

は、次のコードを考えてみましょう:私は、次のオプションを使用してこのG ++(バージョン4.6.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++ -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) 

コンパイラはスカラーの変換について警告を出しましたが、変換の警告はありませんでした。その場合、コンパイラに警告を書き込ませる方法がありますか? -Wconversionのように見えますが、他のオプションはこれをしません。

答えて

0

なぜコンパイラはこれについて警告する必要がありますか?

投稿者ublas::bounded_vector<T,N>は、ublas::bounded_vector<U,N>からの変換を定義していなければなりません。それ以外の場合は、まったく不可能です。そのような関数/コンストラクタがある場合は、コンパイラが使用するときに警告する理由はありません。

+0

私のコードには、この問題が原因でエラーが発生しました。コンパイラが警告を出していれば、すぐに気付いたでしょう。気づくのはかなり難しいので、受け取るのは有益な警告です。 コンパイラから警告メッセージを受け取ることができない場合は、このタイプのバグを検出する別の方法がありますか?私は非常に大きなコードで作業しているので、すべてのファイルを個別に処理することは現実的ではありません。 – mkm

+0

@ mk527:言われたように、世界のどのコンパイラも警告を出すことはできません。そのためには、コンパイラがあなたの意図を見るためにあなたの頭を見ている必要があります;しかし、それと別に、プライベートメンバとしてベクトルを保持するプロキシを書くことを除いて、クリーンなC++ソリューションはないと思います。あなたが本当に必要とするものだけ。 –

関連する問題