在C++中,你可以创建一个“功能型”与例如:如何使用“功能类型”?
void main() {
int a();
}
而一个有型“INT()”,但有可能使用它?我甚至不能传递'a'作为模板参数(但我可以通过“int()”作为一个参数)
在C++中,你可以创建一个“功能型”与例如:如何使用“功能类型”?
void main() {
int a();
}
而一个有型“INT()”,但有可能使用它?我甚至不能传递'a'作为模板参数(但我可以通过“int()”作为一个参数)
您未声明“功能类型”。你正在声明一个函数。这是你通常做在文件范围内同样的事情,但在这种情况下,你做它在局部范围
int main() {
int a(); /* declare function `a` */
...
int i = a(); /* call function `a` */
}
int a() { /* define function `a` */
/* whatever */
}
是的,你可以把它作为一个模板参数。它是一种非类型参数,当然
template <int A()> void foo() {
A(); /* call the function specified by the template argument */
}
int main() {
int a(); /* declare function `a` */
foo<a>(); /* pass it as a template argument */
}
谢谢,解决了我的一个问题! – user647445 2011-03-26 02:11:36
首先,更正:这不是“函数类型”的定义。这是一个函数的声明。
其次,确保您可以使用它:
void main() {
int a();
a(); // call the function!
}
当然,链接器会抱怨没有函数的任何位置定义int a()
,但这是另一个问题完全。
谢谢!你说得对,我在使用sizeof时误导了gcc的错误 – user647445 2011-03-26 02:13:29
您需要定义int a();
这是一个向前声明,这意味着你可以调用内主一()(),而不必放弃功能main()之上的原型。
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
int a();
a();
return 1;
}
int a() {
cout<<"Hello world"<<endl;
}
您可以通过重载函数调用操作符operator()来创建函数类型。例如:
class MyF {
int x_;
public:
MyF(int x) {
x_ = x;
}
public:
void operator()(int y) {
// do something with x, y.
}
}
int main() {
MyF f(3); // create function object
f(4); // call it
}
这是一个原型声明。
int main(int argc, char **argv) {
int a();
int result = a();
}
int a() { return 42; }
也许你实际上是指一个函数指针?
int target() { return 42; }
int main(int argc, char **argv) {
int (*a)();
a = target;
int result = a();
}
现在,其他人已经指出你在那里声明一个函数,而不是一个类型。没有必要进一步深入。
此外,你不能声明或定义“新”功能类型,只有函数(见凯文的回应)。 当然,他们仍然存在,只是你无法定义他们,你也不必。就像指针或引用类型一样,您可以在需要时“使用”它们。
但是,您可以键入一个函数类型。然后,您可以使用别名(类型定义)的指针申报功能,或者该类型的(鲜为人知),甚至功能:
typedef int IntToIntFn(int);
IntToIntFn foo; // same as 'int foo(int);'
IntToIntFn* bar; // same as 'int (*bar)(int);'
int main()
{
foo(42);
bar = &foo;
bar(42);
}
我想你混淆了*函数类型*和*功能*。 'a'是后者,而不是前者,就像'123'是一个整数(但不是整型),'int'是一个整数类型(但不是整数)。 – 2011-03-26 01:49:07
猜测我很困惑,因为当我尝试使用sizeof()时,gcc给出了这个错误:错误:ISO C++禁止将'sizeof'应用于函数类型表达式 – user647445 2011-03-26 02:10:45
是的。 'a'是一个表达。表达式*有*函数类型;也就是说,它的值的类型是一个函数类型;但表达式*不是函数类型。这有帮助,还是仅仅增加混淆? – 2011-03-26 10:58:57