2010-08-19 4 views
3

Pourquoi ce code ne compile-t-il pas?Arguments du modèle C++ dans le constructeur

template <class T> 
class A 
{ 
    public: 
      A(T t) : t_(t) {} 

    private: 
      T t_; 
}; 


int main() 
{ 
    A a(5.5); 
    // A<double> a(5.5); // that's what i don't want to do 
} 

Je souhaite que les arguments de modèle soient implicites.

Comme dans cet exemple:

template<class T> 
T Foo(T t) { return t; } 

// usage: 
Foo(5.5); 

MISE À JOUR: langage constructeur nommé n'est pas acceptable pour moi. Je veux utiliser cette classe pour RAII. La seule façon de le faire est const A& a = A::MakeA(t), mais c'est moche!

+1

La réponse courte est "vous ne pouvez pas". Les modèles de classe ne fonctionnent tout simplement pas de cette façon. Je vais laisser à quelqu'un d'autre le soin d'expliquer la raison. –

Répondre

9

Puisque vous devez nommer le type d'une variable (03 C++ ne peut pas déduire le type d'une variable), vous ne pouvez le faire:

A<double> a(5.5); // that's what i don't want to do 

La situation est un peu plus facile lorsque vous pas besoin de faire une variable du type, mais que vous voulez passer à une autre fonction. Dans ce cas, vous définissez une "fonction constructeur" auxiliaire (voir std::make_pair):

template <class T> 
A<T> make_a(T t) { return A<T>(t); } 

puis l'utiliser comme ceci:

another_function(make_a(1.1)); 

Dans C++ 0x, vous serez en mesure de le faire même

auto a(make_a(5.5)); 

pour définir votre variable a. Cependant, déduire A l'argument de son constructeur est généralement impossible, car vous ne pouvez pas dire quelles spécialisations ont le constructeur de conversion d'un type donné. Imaginez qu'il y ait une spécialisation

template <> 
struct A<void> 
{ 
    A(double); 
}; 
+0

Encore une autre instance de la technique 'indirection' – Chubsdad

+0

merci, je vais essayer de trouver un autre moyen – f0b0s

Questions connexes