2012-05-15 112 views
2

我有以下宏旨在產生在當前範圍內的功能或命名空間:生成函數

#define MAKE_FUNC(FNAME) \ 
template <typename T> \ 
T ##FNAME## (const T& t) \ 
{\ 
    return t; \ 
} 

MAKE_FUNC(foo) 
MAKE_FUNC(boo) 

int main() 
{ 
    foo(1); 
    boo(2); 
} 

以下是編譯上述代碼時的錯誤消息:

prog.cpp:8:1: error: pasting "Tfoo" and "(" does not give a valid preprocessing token 
prog.cpp:9:1: error: pasting "Tboo" and "(" does not give a valid preprocessing token 
prog.cpp:8: error: ISO C++ forbids declaration of ‘Tfoo’ with no type 
prog.cpp:9: error: ISO C++ forbids declaration of ‘Tboo’ with no type 
prog.cpp: In function ‘int main()’: 
prog.cpp:13: error: ‘foo’ was not declared in this scope 
prog.cpp:14: error: ‘boo’ was not declared in this scope 

http://ideone.com/paiu1

好像串聯有失敗,反正是有解決這個問題?

+2

連接並未失敗。它的工作與廣告完全一樣。看起來你並不想要連接。 –

+2

我知道我應該是所有我很好,你很好,但是*宏大部分時間都是*。 –

+1

@ R.MartinhoFernandes:非常真實。 :) –

回答

10

你想

T FNAME (const T& t) \ 

##會連接,你不想來連接。

+0

這樣做很不錯。 –