2013-04-25 2 views
4

J'ai créé une classe de matrice et souhaite ajouter deux matrices de types de données différents. Comme pour int et double retour, le type de matrice doit être double. Comment puis je faire ça??? Ce est mon codetype de retour inconnu pour les classes de modèles

template<class X> 
class Matrix 
{ 
.......... 
........ 
template<class U> 
Matrix<something> operator+(Matrix<U> &B) 
{ 
if((typeid(a).before(typeid(B.a)))) 
Matrix<typeof(B.a)> res(1,1); 
else 
Matrix<typeof(a)> res(1,1); 
} 

Quel devrait être "quelque chose" ici ???

Aussi ce qui devrait être fait pour que je puisse employer "res" dehors sinon la déclaration ???

+2

Quelque chose comme ['std :: common_type'] (http://fr.cppreference.com/w/cpp/types/common_type)? – dyp

Répondre

5

Vous pouvez gérer ces deux problèmes avec C++ 11 de la syntaxe de type de retour automatiquel'aide généreuse de @DyP :).

template<typename U> 
Matrix <decltype(declval<X>()+declval<U>())> operator+(const Matrix<U> &B) const 
{ 
    Matrix< decltype(declval<X>() + declval<U>()) > res; 

    // The rest... 
} 

Avec cette syntaxe, votre « quelque chose » sera le type C++ produit normalement quand on ajoute les deux types de modèle.

+0

@DyP C'est C++ 11 essai-par-feu pour moi. Recommanderiez-vous 'declval ()' sur ce que j'ai posté? –

+1

Je pensais à l'aide de 'template Matrix () + declval ())> opérateur + (Matrix const & p);' – dyp

+0

je ne peux pas obtenir .... je reçois les erreurs suivantes ... .../usr/include/C++/4.6/bits/C++ 0x_warning.h: 32: 2: erreur: #error Ce fichier nécessite la prise en charge du compilateur et de la bibliothèque pour la prochaine norme ISO C++, C++ 0x. le support est actuellement expérimental et doit être activé avec les options du compilateur -std = C++ 0x ou -std = gnu ++ 0x inserter.cpp: 201: 20: erreur: 'declval' n'a pas été déclaré dans cette portée inserter.cpp: 201: 33: erreur: 'declval' n'a pas été déclaré dans cette portée inserter.cpp: 201: 45: erreur: un appel de fonction ne peut pas apparaître dans une expression constante inserter.cpp: 201: 46: erreur : l'argument template 1 est invalide –

4

Essayez common_type:

#include <type_traits> 

template <typename T> 
class Matrix 
{ 
    // ... 

    template <typename U>  
    Matrix<typename std::common_type<T, U>::type> 
    operator+(Matrix<U> const & rhs) 
    { 
     typedef typename std::common_type<T, U>::type R; 

     Matrix<R> m; // example 
     // ... 
     return m; 
    } 
}; 
+0

son ne fonctionne pas m obtenir les erreurs suivantes /usr/include/c++/4.6/bits/c++0x_warning.h:32:2: erreur: #error Ce fichier nécessite le support du compilateur et de la bibliothèque pour la prochaine norme ISO C++, C++ 0x. Ce support est actuellement expérimental et doit être activé avec les options du compilateur -std = C++ 0x ou -std = gnu ++ 0x. inserter.cpp: 201: 28: erreur: 'common_type' dans l'espace de noms 'std' ne nomme pas un type inserter.cpp: 201: 39: erreur: argument de modèle attendu avant '<' jeton inserter.cpp: 201 : 39: error: attendu '>' avant '<' token –

+1

@TilakRajSingh Ces fonctionnalités sont des fonctionnalités C++ 11 - soit compiler avec '-std = C++ 0x' soit utiliser boost ou demander une solution C++ 03 :) – dyp

+0

J'utilise le compilateur g ++ dans Ubuntu 12.04 –

Questions connexes