Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
g++;编译器与隐式转换 < >我用G++编译我的C++程序,但是我想停止像int和doBLE之类的隐式转换,例如: 我有一个使用double作为参数的函数,但是当我在这个函数的参数中发送int时,编译过程没有错误或警告_C++_G++_Type Conversion_Implicit Conversion - Fatal编程技术网

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:在链接时失败,而不是编译时。