Hier ist ein paar verwandte, aber unterschiedliche Klassen. Einer enthält eine Liste von Schwimmern; man enthält nur einen. Manchmal möchte ich, sagen wir, diese zusammen vermehren. In diesem Fall möchte ich die Nicht-Liste zu einer Liste "befördern". Hier ist der Code, der genau so funktioniert, wie ich es möchte.Implizite Konvertierung passiert nicht, wenn ich templatize
#define LIST_SZ 4
class Vec1;
class Vec1_list {
public:
Vec1_list() {}
Vec1_list(const Vec1& in);
float x[LIST_SZ];
};
class Vec1 {
public:
Vec1() {}
Vec1(const float& in);
float x;
};
Vec1::Vec1(const float& in) {
x = in;
}
Vec1_list::Vec1_list(const Vec1& in) {
for (int i = 0; i < LIST_SZ; i++) {
x[i] = in.x;
}
}
Vec1_list operator*(const Vec1_list& a, const Vec1_list& b) {
Vec1_list tmp;
for (int i = 0; i < LIST_SZ; i++) {
tmp.x[i] = a.x[i]*b.x[i];
}
return tmp;
}
int main(void) {
Vec1 v1;
Vec1_list v2, v3, answer;
answer = v1*v3;
}
Aber jetzt sage ich es wie so templatize wollen ....
#define LIST_SZ 4
template <typename T> class Vec1;
template <typename T>
class Vec1_list {
public:
Vec1_list() {}
Vec1_list(const Vec1<T>& in);
T x[LIST_SZ];
};
template <typename T>
class Vec1 {
public:
Vec1() {}
Vec1(const T& in);
T x;
};
template <typename T>
Vec1<T>::Vec1(const T& in) {
x = in;
}
template <typename T>
Vec1_list<T>::Vec1_list(const Vec1<T>& in) {
for (int i = 0; i < LIST_SZ; i++) {
x[i] = in.x;
}
}
template <typename T>
Vec1_list<T> operator*(const Vec1_list<T>& a, const Vec1_list<T>& b) {
Vec1_list<T> tmp;
for (int i = 0; i < LIST_SZ; i++) {
tmp.x[i] = a.x[i]*b.x[i];
}
return tmp;
}
int main(void) {
Vec1<float> v1;
Vec1_list<float> v2, v3, answer;
answer = v1*v3;
}
Die 'mult' bewirkt, dass der Compiler diese Zeit ersticken - es wird nicht automatisch meine Vec1 aufrufen -> Vec1_list Konstrukteur. Ist das eine Tatsache des Lebens in C++, oder gibt es eine Methode, die ich verwenden kann, um dies automatisch zu erreichen? Die Alternative ist, dass ich einen riesigen Fan von Funktionen haben muss.