2012-03-22 34 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