Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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
C++ c+的地址+;模板函数_C++_Templates_Function Pointers_C++11 - Fatal编程技术网

C++ c+的地址+;模板函数

C++ c+的地址+;模板函数,c++,templates,function-pointers,c++11,C++,Templates,Function Pointers,C++11,为什么编译失败?(g++-4.5) 模板 静态孔隙h(){ } int main(){ 自动p=&h;//错误:p的类型不完整 } 编辑:以下是解决方法: template < typename U > static void h () { } int main () { typedef decltype (&h<int>) D; D p = &h<int>; // works } 模板 静态孔隙h(){ } int main()

为什么编译失败?(g++-4.5)

模板
静态孔隙h(){
}
int main(){
自动p=&h;//错误:p的类型不完整
}
编辑:以下是解决方法:

template < typename U >
static void h () {
}

int main () {
  typedef decltype (&h<int>) D;
  D p = &h<int>; // works
}
模板
静态孔隙h(){
}
int main(){
typedef decltype(&h)D;
dp=&h;//有效
}

> p>它不编译,因为编译器中不知道p的类型,它是C++中必须的,不像其他语言。 试一试

模板
静态空h(){
} 
int main(){
自动作废(*p)(=&h;
} 

在C++0x中,这是可以保证工作的。然而,在C++03中,这不起作用(即初始值设定项部分),一些编译器显然还不支持它

此外,我记得C++0x的措词不清楚
&h
作为函数模板的参数并推导出相应的参数时会发生什么(从概念上讲,这就是
auto
所翻译的)。然而,目的是它是有效的。看看他们在哪里设计的措辞,“尼科·约瑟蒂斯”的例子和他们的最后一个例子

还有一条规则是措辞强制执行,但编译器没有正确执行。例如,.

试试看

 auto p  = static_cast<void(*)()>(& h<int>);
对于gcc,
h
就像重载的
h
函数一样,根据
T
参数有无数的选择。根据所提供的代码,可以执行以下操作:

void h(int)
{
}

void h(float)
{
}

void (*p)(int) = & h;  //ok
void (*p)(float) = & h; //ok
auto p = & h; //error: which version of h?
void (*p)() = & h<int>;
但出于某种原因,对于gcc来说,它们就像是
h
的重载版本


请给出否决票的理由

auto
关键字用于自动类型推断。一个C++0x特性。好的,但在我的实际代码中,h根据U和其他模板接受许多其他参数,我不想全部指定,因为编译器应该知道p的类型。@dirkgenly:Oh。我仍然在C++ 03,其中“自动”是自动变量。问题可能是关于C++ 0x<代码>自动<代码>,它应该能够自动地确定类型,“旧”“这是一个堆栈变量”-Auto.CoMo在线梳理它在Visual Studio 2010上完成的很好。这很可能是GCC的一个小故障。您可以尝试的是
decltype(&h)p=&h
@DeadMG:如果没有“auto”,甚至不需要键入def,
void(*p)(=&h
也会编译。我不是向下投票者:)无论如何,我不确定是否理解您的逻辑:因为您是静态的\u转换到编译时已知的类型,auto有什么用?@Francesco:如果没有转换,gcc会抛出一个错误“语句无法解析重载函数的地址”。如果函数重载(如
void h(int)
void h(float)
),编译器在找到
&h
语句时无法确定要选择哪个版本,则会出现相同的错误。出于某种原因(我认为这是模板参数发现的原因),模板化函数的处理方式与重载函数相同。在我像在重载函数的情况下一样使用静态_cast之后,它开始编译
auto
用于推断
p
类型。@Francesco:他们使用
typedef
得到的结果与静态类型转换相同。我以为他想要C++0x
auto
关键字……我同意typedef也有同样的问题:必须手动指定类型,因此自动类型推断的优势就丧失了。
void h(int)
{
}

void h(float)
{
}

void (*p)(int) = & h;  //ok
void (*p)(float) = & h; //ok
auto p = & h; //error: which version of h?
void (*p)() = & h<int>;
void hInt()
{
}

void hFloat()
{
}

auto p = hInt;
p = hFloat;