Giorgos65ert Δημοσ. 24 Ιουνίου 2015 Δημοσ. 24 Ιουνίου 2015 Γεια σας παιδιά έχω μια απορία γίνετε να βάλω ένα template σε ένα source file(.cpp) και να κάνω include μόνο το header μέσα σε ένα main.cpp? αν ναι πως? έχω προσπαθήσει άλλα το μόνο που βγάζει είναι errors... το template που έχω είναι το εξής: template < class T > T minium(T a, T b,T c){ T minV = a; if (b < minV ) minV = b; if (c < minV ) minV = c; return minV ; } ευχαριστώ!
lion2486 Δημοσ. 24 Ιουνίου 2015 Δημοσ. 24 Ιουνίου 2015 Δεθν θυμάμαι τώρα ακριβώς τον λόγο, ούτε και τη "σωστή" και κομψή λύση, αλλά για να σου δουλέψει εύκολα μπορείς απλά στο τέλος του αρχείου να δηλώσεις όλους τους τύπους μεταβλητών που θα πάρουν τη θέση του T.
παπι Δημοσ. 24 Ιουνίου 2015 Δημοσ. 24 Ιουνίου 2015 Όχι, διότι τα template δεν γίνονται compile. Θα το βάλεις σε ένα header file.
Giorgos65ert Δημοσ. 24 Ιουνίου 2015 Μέλος Δημοσ. 24 Ιουνίου 2015 Δεθν θυμάμαι τώρα ακριβώς τον λόγο, ούτε και τη "σωστή" και κομψή λύση, αλλά για να σου δουλέψει εύκολα μπορείς απλά στο τέλος του αρχείου να δηλώσεις όλους τους τύπους μεταβλητών που θα πάρουν τη θέση του T. αν κατάλαβα καλά δηλαδή να κάνω 4-5 συνάρτησης που να έχουν διαφορετικους τύπους? float,double,int...etc? ευχάριστο για της απάντησης παιδιά μάλλον θα βάλω το template στο header file όπως είπε και το παπι πιο πάνω για να γλιτώσω κωδικά.
lion2486 Δημοσ. 24 Ιουνίου 2015 Δημοσ. 24 Ιουνίου 2015 αν κατάλαβα καλά δηλαδή να κάνω 4-5 συνάρτησης που να έχουν διαφορετικους τύπους? float,double,int...etc? ευχάριστο για της απάντησης παιδιά μάλλον θα βάλω το template στο header file όπως είπε και το παπι πιο πάνω για να γλιτώσω κωδικά. Απλά βάλε στο αρχείο στο τέλος template class TemplateName<int>; template class TemplateName<double>;
defacer Δημοσ. 24 Ιουνίου 2015 Δημοσ. 24 Ιουνίου 2015 ευχάριστο για της απάντησης παιδιά μάλλον θα βάλω το template στο header file όπως είπε και το παπι πιο πάνω για να γλιτώσω κωδικά. Η υλοποίηση των templates μπαίνει σε header όπως είπε το παπί, αν και αυτό γίνεται και έμμεσα. Ο λόγος είναι ότι ο compiler κάνει code generation για ένα template μόνο όταν φτάσει στο σημείο να δει χρήσεις όπου το template είναι fully specialized. Αν δηλαδή εσύ κατά το compilation ενός translation unit έχεις στο header template.h template<typename T> class Foo { public: void bar(); }; το οποίο το χρειάζεσαι κάπου επειδή π.χ. χρησιμοποιείς ένα Foo<int>* τότε ο compiler δεν πρόκειται να κάνει τίποτα (γιατί δε χρειάζεται). Μετά όταν φτάσει στο υποτιθέμενο template.cpp εκεί ναι μεν ορίζεις το Foo αλλά δεν έχεις καμία χρήση του, οπότε ούτε εκεί κάνει codegen. Και τελικά έρχεται ο linker και σου λέει φίλος, όλοι λένε για Foo<X> και για Foo<Y> κλπ κλπ αλλά εγώ κώδικα γι' αυτό δε βλέπω πουθενά. Υπόψιν ότι μπορείς να κάνεις το εξής, που είναι στην ουσία το ίδιο με το να τα βάζεις στο header απλά λίγο καλύτερο οργανωτικά για σένα: // templ.h template<...> class Foo { void method(...); }; #include "templ.cpp" // templ.cpp template<...> void Foo<...>::method(...) {}
Giorgos65ert Δημοσ. 25 Ιουνίου 2015 Μέλος Δημοσ. 25 Ιουνίου 2015 Η υλοποίηση των templates μπαίνει σε header όπως είπε το παπί, αν και αυτό γίνεται και έμμεσα. Ο λόγος είναι ότι ο compiler κάνει code generation για ένα template μόνο όταν φτάσει στο σημείο να δει χρήσεις όπου το template είναι fully specialized. Αν δηλαδή εσύ κατά το compilation ενός translation unit έχεις στο header template.h template<typename T> class Foo { public: void bar(); }; το οποίο το χρειάζεσαι κάπου επειδή π.χ. χρησιμοποιείς ένα Foo<int>* τότε ο compiler δεν πρόκειται να κάνει τίποτα (γιατί δε χρειάζεται). Μετά όταν φτάσει στο υποτιθέμενο template.cpp εκεί ναι μεν ορίζεις το Foo αλλά δεν έχεις καμία χρήση του, οπότε ούτε εκεί κάνει codegen. Και τελικά έρχεται ο linker και σου λέει φίλος, όλοι λένε για Foo<X> και για Foo<Y> κλπ κλπ αλλά εγώ κώδικα γι' αυτό δε βλέπω πουθενά. Υπόψιν ότι μπορείς να κάνεις το εξής, που είναι στην ουσία το ίδιο με το να τα βάζεις στο header απλά λίγο καλύτερο οργανωτικά για σένα: // templ.h template<...> class Foo { void method(...); }; #include "templ.cpp" // templ.cpp template<...> void Foo<...>::method(...) {} ευχάριστο πολύ αυτό δουλεύει άψογα τελικά αυτό αντικατέστησα να είστε καλά παιδιά ευχάριστο για την βοήθεια και πάλι!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα