J'essaye de construire un constructeur pour prendre un tableau comme un argument qui surcharge un autre qui prend un scalaire à la place. Le code est ci-dessous.Constructeur de gabarit de classe C++ - référence de surcharge (U &) avec tableau (U *) échoué
#include <iostream>
template <typename T>
class SmallVec { // This is a 3 dimensional vector class template
public:
T data[3] = {0}; // internal data of class
template <typename U>
explicit SmallVec(const U& scalar) { // if a scalar, copy it to each element in data
for(auto &item : data) {
item = static_cast<T>(scalar);
}
}
template <typename U>
explicit SmallVec(const U* vec) { // if a vector, copy one by one
for(auto &item : data) {
item = static_cast<T>(*vec);
vec++;
}
}
};
int main() {
float num = 1.2;
float *arr = new float[3];
arr[2] = 3.4;
SmallVec<float> vec1(num); // take num, which works fine
SmallVec<float> vec2(arr); // !!!--- error happens this line ---!!!
std::cout << vec1.data[2] << " " << vec2.data[2] << std::endl;
return 0;
}
Le compilateur se plaint que
error: invalid static_cast from type 'float* const' to type 'float'
De toute évidence, vec2(arr)
appelle toujours le premier constructeur. Toutefois, si j'enlève template <typename U>
et remplace U
par T
. Le programme fonctionne bien. Que dois-je faire pour corriger cela?
Toutes les suggestions sont appréciées!
Indice: Le premier constructeur est appelé deux fois. – LogicStuff
@LogicStuff Merci beaucoup pour le commentaire rapide. Oui, le premier constructeur est appelé à nouveau. Cela signifie probablement tableau (ou pointeur vers tableau) est passé par référence? Mais comment dois-je dire au programme de trouver le second constructeur, ou comment devrais-je distinguer si l'argument est scalaire ou tableau dans la première méthode? Voulez-vous me donner quelques indices s'il vous plaît? – astroboylrx
Vous devrez utiliser [SFINAE] (http://en.cppreference.com/w/cpp/language/sfinae) ou l'envoi de tags. – LogicStuff