2010-12-24 3 views
1

Я использую g ++ для компиляции моей программы на C++, но я хочу остановить неявное преобразование между типами, такими как int и dooble, например: У меня есть функция, которая использует параметр double as, но когда Я посылаю в параметр этой функции int, компиляционный проход без ошибки или предупреждения.g ++ компилятор и неявное преобразование

так что это мой вопрос, как остановить неявные преобразования?

спасибо.

+1

Это часть языка. –

+0

Возможный дубликат [Предупреждения или ошибки для C++ неявного преобразования примитивов] (http://stackoverflow.com/questions/4477139/warnings-or-errors-for-c-implicit-conversion-of-primitives) –

ответ

2

Вы не можете избежать неявного преобразования от более низкого к более высокому типу. Однако вы можете сделать наоборот , если ваш компилятор поддерживает C++ 0x.

void func(int x){} 

int main() 
{ 
    func({2.3}); // error: narrowing 
} 
+0

Я нашел a флаг, который отправляет предупреждение (-Wconversion), но направление преобразования. но я все еще ищу, как отправить сообщение об ошибке. – CHAKRI

+1

@CHAKRI: -Werror –

+0

@Greg Hewgill: да, это работает без сообщения об ошибке, но это нормально. спасибо, ребята. – CHAKRI

4

Вы можете попробовать это:

#include <iostream> 

template<typename T> 
void func(T t); 

void func(double d) 
{ 
    std::cout << "D:" << d << "\n"; 
} 


int main() 
{ 
    func(2.3); // OK 
    func(2);  // Fails at compile time. 
} 
+0

спасибо, я пробовал этот способ, и он работает, но я думаю, что я буду использовать флаг -Werror = conversion в моем make-файле. это было проще и выполнялось. – CHAKRI

+0

Тонкая разница: не получается время связывания, а не время компиляции. – GingerPlusPlus

1

Я думаю, что ответ Мартина это путь. Он может найти преобразование во время соединения. Если вы должны найти во время компиляции, вы можете добавить static_assert или схожий шаблона функции:

template<typename T> 
void func(T) { 
    //static_assert(sizeof(T) == 0, "..."); // if you can use static_assert 
    int a[ (sizeof(T) == 0) ? 1 : -1 ]; 
} 

Надежда это помогает.

Смежные вопросы