[問題] Variadic Macros + tamplate問題

看板C_and_CPP作者 (Bad_To_The_Bone)時間11年前 (2014/09/23 17:52), 編輯推噓4(407)
留言11則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) vc 2005 問題(Question): 定義 variadic macros 時 , 與 tamplate的 , 無法區分 #define MACRO_C(msg, ...) \ {\ ostringstream oss; \ oss << "MACRO_B: " << __VA_ARGS__ << " " << msg; \ cout << oss.str() << endl; \ } 在這行時 會把tamplate的逗號當作是上面 msg與 ...的區隔 MACRO_C("NOT " << FUN_C<int, float>(14) << " MACRO_C: " << 15 , "ERROR?"); 想請教一下如何寫才能避免此情況呢 感謝 程式碼(Code):(請善用置底文網頁, 記得排版) #include <sstream> #include <iostream> using namespace std; #define MACRO_A(x) \ {\ ostringstream oss; \ oss << x; \ cout << oss.str() << endl; \ } #define MACRO_B(...) \ {\ ostringstream oss; \ oss << "MACRO_B: " << __VA_ARGS__; \ cout << oss.str() << endl; \ } #define MACRO_C(msg, ...) \ {\ ostringstream oss; \ oss << "MACRO_B: " << __VA_ARGS__ << " " << msg; \ cout << oss.str() << endl; \ } string FUN_B(int x) { ostringstream oss; oss << x; return oss.str(); } template<class X, class Y> string FUN_C(X x) { ostringstream oss; oss << x; return oss.str(); } int _tmain(int argc, _TCHAR* argv[]) { MACRO_A("MACRO_A: " << 1 << " MACRO_A: " << 2); MACRO_A("MACRO_A: " << FUN_B(3) << " MACRO_A: " << 4); string c = FUN_C<int, float>(5); MACRO_A("MACRO_A: " << c << " MACRO_A: " << FUN_B(6)); // MACRO_A("MACRO_A: " << FUN_C<int, float>(7) << " MACRO_A: " << FUN_B(8)); MACRO_B(FUN_C<int, float>(9)); MACRO_B("I AM " << FUN_C<int, float>(10) << " MACRO_B: " << 11); MACRO_C("OK?", "MACRO_C: " << 12 << " MACRO_C: " << 13); // MACRO_C("NOT " << FUN_C<int, float>(14) << " MACRO_C: " << 15 , "ERROR?"); return 0; } 補充說明(Supplement): 上面黃色兩行都會compile error 第二個ERROR屬於我敘述問題的情況 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.59.147.226 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1411465939.A.9E6.html

09/23 17:56, , 1F
換用一個新一點的 compiler.. (逃
09/23 17:56, 1F

09/23 17:58, , 2F
^^; 這情況不會出現在新版的嗎....
09/23 17:58, 2F

09/23 19:59, , 3F
( FUN_C<int, float>(14) ) 加括號
09/23 19:59, 3F

09/23 20:00, , 4F
至少 g++ 4.8.2 會過
09/23 20:00, 4F

09/23 20:44, , 5F
嗯,我知道比較老的compiler對 template 的 < > 語法處
09/23 20:44, 5F

09/23 20:45, , 6F
理比較弱, 像是 A<B<T>> 的 >> 認成位移運算出錯..
09/23 20:45, 6F

09/23 20:45, , 7F
所以想說也許換新的有機會 XDXD
09/23 20:45, 7F

09/23 21:49, , 8F
樓上那是 C++98 的規定如此, C++11 有新增規定處理這種狀況
09/23 21:49, 8F

09/23 21:50, , 9F
不過我現在已經習慣在中間塞個空白就是了...
09/23 21:50, 9F

09/24 09:20, , 10F
剛剛試了 用() 可行 感謝大家 :)
09/24 09:20, 10F

09/24 14:12, , 11F
想用macro省code 真是蠻多地方要注意的 危險危險^^;
09/24 14:12, 11F
文章代碼(AID): #1K8KBJdc (C_and_CPP)