2011-09-16 3 views
3

Je ne sais pas si ce que je essaie de faire est mauvais, mais voici ma question: J'ai un modèle de certaines fonctions commeune macro sur les modèles

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); 

.... et ainsi de suite. Toutes ces fonctions ont exactement la même définition, sauf pour l'opérateur, donc je suis en train d'écrire une macro comme celui-ci

#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 (+) 

Et je reçois un tas d'erreurs

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 

... et plus Quelqu'un peut-il voir quel est le problème avec cela?

Merci pour toute aide.

CV

+0

Comment allez-vous '+' deux vecteurs qui contiennent 'T'? Et comment allez-vous '&' et '-' deux vecteurs? – Nawaz

+0

mon mauvais .. c'était une faute de frappe, code édité – blueskin

+0

ok .. comme Kerrek SB et ildjarn a souligné, ce sont des erreurs de syntaxe stupides. – blueskin

Répondre

2

Pas d'espace avant la liste des arguments macro!

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

Et un backslash à la fin pour échapper à la nouvelle ligne, non? – ildjarn

+0

ahhh, merde .. de telles erreurs stupides .. Je me déteste pour cela – blueskin

+0

@ildjarn: Ah, oui, la première nouvelle ligne est allée sans s'échapper. Bonne prise. –

0

Je pense répéter la définition sera plus simple que les macro-:) fiant Parfois, il est tout simplement préférable de vous répéter que de eek efficacité plus besoin de taper.

+0

Dans certains cas très simples peut-être, mais vous pouvez avoir un code qui est grand et doit être répété. Répéter la définition signifie que si vous changez quelque chose en un, vous devez aller le changer dans chacun d'entre eux ce qui introduit une incohérence possible. – Shahbaz

+0

Je suis d'accord ........ – blueskin

+0

Eh bien, j'ai essayé lol.Je souhaite que nous aurions pu faire sans les downvotes si: \ –

2

Vous avez un espace non valide avant la liste des arguments macro et manqués d'échapper à la nouvelle ligne après:

#define _BINARY_OP_ON_DATASET(OP_TYPE) \ 
    ... 
3

Supprimer l'espace entre le nom de la macro et ses arguments.

#define _BINARY_OP_ON_DATASET(OP_TYPE) 

Ajouter \ à la première ligne de votre modèle

#define _BINARY_OP_ON_DATASET(OP_TYPE)\ 

Retirez les erreurs mineures, telles que la ; vous avez oublié dans la deuxième ligne de votre corps de la fonction

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

Et ça compile bien!

+0

merci shahbaz .. – blueskin