2011-09-16 5 views
3

わからない: は、私はそうでテンプレートのマクロ何をしようとしていることは悪いですが、ここで私の質問だ場合

std::vector<T> operator - (const std::vector<T>& data1, const std::vector<T>& data2); 
std::vector<T> operator * (const std::vector<T>& data1, const std::vector<T>& data2); 
std::vector<T> operator & (const std::vector<T>& data1, const std::vector<T>& data2); 

ようないくつかのテンプレート機能を持っている....と。これらすべての機能は、オペレータ以外はまったく同じ定義を持っているので、私はこの

#define _BINARY_OP_ON_DATASET (OP_TYPE) 
    template <typename T> \ 
    std::vector<T> operator OP_TYPE (const std::vector<T>& data1, const std::vector<T>& data2)\ 
    {\ 
    std::vector<T> result;\ 
    result.push_back(data1.begin().val OP_TYPE data1.begin().val)/*sample implementation*/\ 
    return result;\ 
    } 

_BINARY_OP_ON_DATASET (&) 
_BINARY_OP_ON_DATASET (+) 

ようなマクロを書くしようとしていたと私はエラー

Error 1 error C2833: 'operator OP_TYPE' is not a recognized operator or type 
Error 2 error C2988: unrecognizable template declaration/definition 
Error 3 error C2059: syntax error : 'newline' 
Error 5 error C2143: syntax error : missing ';' before '<' 
Error 6 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

...ともっとの束を得ます 誰もがこの問題を見てもらえますか?

ありがとうございました。

CV

+0

'+' 'T 'を含む2つのベクトルにどのように行きますか?そして、あなたはどのように2つのベクトルを '&'と '--'にしますか? – Nawaz

+0

私の悪い..それはタイプミス、編集されたコード – blueskin

+0

ok .. Kerrek SBとildjarnが指摘するように、彼らは愚かな構文ミスです。 – blueskin

答えて

2

マクロ引数リストの前にスペースはありません!

#define _BINARY_OP_ON_DATASET(OP_TYPE) ... 
          ^^^ 
+2

最後に改行をエスケープするバックスラッシュはありますか? – ildjarn

+0

ああ、そんなに愚かな間違い。私はそれのために自分自身が嫌いです。 – blueskin

+0

@ildjarn:ああ、はい、最初の改行はエスケープされませんでした。良いキャッチ。 –

0

私は定義を繰り返すこと、それらをマクロfyingよりも簡単になると思う:)もっとタイピング効率をEEKするよりも、時には自分自身を繰り返すだけの方が良いでしょう。

+0

なので、非常に単純な場合もあるかもしれませんが、コードが大きくて繰り返しが必要な場合があります。定義を繰り返すということは、あるものを変更した場合、そのすべてを変更しなければならない可能性があることを意味します。 – Shahbaz

+0

私は同意する........ – blueskin

+0

ああ、私は笑いました。\ –

2

あなたはマクロ引数リストの前に無効なスペースを持っており、それの後に改行をエスケープ逃した:

#define _BINARY_OP_ON_DATASET(OP_TYPE) \ 
    ... 
3

は、マクロ名とそれの引数の間のスペースを削除します。

#define _BINARY_OP_ON_DATASET(OP_TYPE) 

など、あなたの関数本体の2行目に

result.push_back(data1.begin().val+data1.begin().val); 

を忘れてしまった;など軽微なエラーを、削除テンプレートの最初の行に

#define _BINARY_OP_ON_DATASET(OP_TYPE)\ 

\を追加し、それはうまくコンパイルされます!

+0

ありがとうshahbaz .. – blueskin

関連する問題