在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