g++;编译器与隐式转换 < >我用G++编译我的C++程序,但是我想停止像int和doBLE之类的隐式转换,例如: 我有一个使用double作为参数的函数,但是当我在这个函数的参数中发送int时,编译过程没有错误或警告
这就是我的问题,如何停止隐式转换g++;编译器与隐式转换 < >我用G++编译我的C++程序,但是我想停止像int和doBLE之类的隐式转换,例如: 我有一个使用double作为参数的函数,但是当我在这个函数的参数中发送int时,编译过程没有错误或警告,c++,g++,type-conversion,implicit-conversion,C++,G++,Type Conversion,Implicit Conversion,这就是我的问题,如何停止隐式转换 谢谢。您无法避免从低级类型到高级类型的隐式转换。然而,你也可以这样做,反之亦然 如果您的编译器支持C++0x void func(int x){} int main() { func({2.3}); // error: narrowing } 您无法避免从低级类型到高级类型的隐式转换。然而,你也可以这样做,反之亦然 如果您的编译器支持C++0x void func(int x){} int main() { func({2.3}); // er
谢谢。您无法避免从低级类型到高级类型的隐式转换。然而,你也可以这样做,反之亦然 如果您的编译器支持C++0x
void func(int x){}
int main()
{
func({2.3}); // error: narrowing
}
您无法避免从低级类型到高级类型的隐式转换。然而,你也可以这样做,反之亦然 如果您的编译器支持C++0x
void func(int x){}
int main()
{
func({2.3}); // error: narrowing
}
你可以试试这个:
#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.
}
#包括
模板
无效函数(T);
无效函数(双d)
{
std::cout您可以尝试以下方法:
#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.
}
#包括
模板
无效函数(T);
无效函数(双d)
{
我认为马丁的答案是正确的。
它可以在链接时找到转换。
如果必须在编译时查找,可以添加static\u 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 ];
}
模板
无效函数(T){
//static_assert(sizeof(T)==0,“…”;//如果可以使用static_assert
int a[(sizeof(T)==0)?1:-1];
}
希望这能有所帮助。我认为马丁的答案是正确的。
它可以在链接时找到转换。
如果必须在编译时查找,可以添加static\u 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 ];
}
模板
无效函数(T){
//static_assert(sizeof(T)==0,“…”;//如果可以使用static_assert
int a[(sizeof(T)==0)?1:-1];
}
希望这有帮助。这是语言的一部分。这可能是语言的一部分。这可能是语言的一部分。我发现了一个发送警告的标志(-Wconversion)不过,转换的方向是正确的。但我仍在搜索如何发送错误。@Greg Hewgill:是的,没有错误消息,但这很好。谢谢各位。我不明白。即使您调用func({2}),g++-std=c++0x仍返回错误。编译器无法将初始化器列表转换为int,列表中的任何内容。@Prasony Saurav:不在我的计算机上!(g++4.4.0代表mingw32。)c:\Temp>g++-std=c++0x foo.cpp foo.cpp:在函数“int main()”:foo.cpp:5:错误:无法将参数“1”转换为“void func(int)”的“int”'我找到了一个发送警告的标志(-Wconversion),但它指示了转换的方向。但我仍在搜索如何发送错误。@Greg Hewgill:是的,没有错误消息,但这很好。谢谢大家。我不明白这一点。即使你调用func({2}),g++-std=c++0x仍返回错误。编译器无法将初始化器列表转换为int,列表中的任何内容。@Prasony Saurav:不在我的计算机上!(g++4.4.0代表mingw32。)c:\Temp>g++-std=c++0x foo.cpp foo.cpp:在函数“int main()”:foo.cpp:5:错误:无法将参数“1”转换为“void func(int)”的“int”“谢谢,我尝试了这种方法,效果很好,但我想我会在我的makefile中使用-Werror=转换标志。它更简单,并且完成了工作。细微的区别:链接时失败,而不是编译时。谢谢,我尝试了这种方法,效果很好,但我想我会在我的makefile中使用-Werror=转换标志。它更简单,并且完成了工作。细微的区别。”ence:在链接时失败,而不是编译时。