Was macht man mit solch einer Fehlermeldung?
-
@zeropage Naja man könnte die Punkte noch
topLeft
undrightBottom
nennen, und die ctor Parameter entsprechendleft, top, right, bottom
. Dann wäre das einfacher zu lesen & verwenden.Und: Wenn du schon einen typedef ala
val_t
verwendest, und den in der Definition verwendest, würde ich den tendenziell eherpublic
machen.
-
@hustbaer sagte in Was macht man mit solch einer Fehlermeldung?:
Und: Wenn du schon einen typedef ala
val_t
verwendest, und den in der Definition verwendest, würde ich den tendenziell eherpublic
machen.Vielleicht ne blöde Frage, aber warum eigentlich? Der Klasse selbst ist es ja wurscht?
-
@zeropage sagte in Was macht man mit solch einer Fehlermeldung?:
@hustbaer sagte in Was macht man mit solch einer Fehlermeldung?:
Und: Wenn du schon einen typedef ala
val_t
verwendest, und den in der Definition verwendest, würde ich den tendenziell eherpublic
machen.Vielleicht ne blöde Frage, aber warum eigentlich? Der Klasse selbst ist es ja wurscht?
wozu eigentlich "val_t" überhaupt?
-
@It0101 sagte in Was macht man mit solch einer Fehlermeldung?:
wozu eigentlich "val_t" überhaupt?
Gewohnheit.
-
@zeropage sagte in Was macht man mit solch einer Fehlermeldung?:
@It0101 sagte in Was macht man mit solch einer Fehlermeldung?:
wozu eigentlich "val_t" überhaupt?
Gewohnheit.
Was ist denn der Vorteil ? warum nicht einfach direkt "T" nehmen?
-
Weil es egal ist.
-
@zeropage sagte in Was macht man mit solch einer Fehlermeldung?:
Weil es egal ist.
Nein. Ist es nicht. Bei "T" weiß sofort jeder Leser des Quellcodes was gemeint ist.
Ist kein großes Drama, da hast du recht. Aber zumindest ungewöhnlich.
Wobei das hier genauso möglich ist. Der Typ muss nicht zwangsläufig "T" heißen.
template <typename val_t> class myClass { };
-
@zeropage sagte in Was macht man mit solch einer Fehlermeldung?:
@hustbaer sagte in Was macht man mit solch einer Fehlermeldung?:
Und: Wenn du schon einen typedef ala
val_t
verwendest, und den in der Definition verwendest, würde ich den tendenziell eherpublic
machen.Vielleicht ne blöde Frage, aber warum eigentlich? Der Klasse selbst ist es ja wurscht?
Naja schlimm ist es nicht. Ich finde es nur komisch (ohne guten Grund) einen Typ-Namen in der Signatur von public Funktionen zu verwenden, den man von ausserhalb nicht verwenden kann.
Ich persönlich würde da genau so wie @It0101 es schon vorgeschlagen hat gar keinen Typedef/Alias verwenden, sondern einfach T hinschreiben. Weil das IMO einfacher zu lesen ist - man weiss dann sofort was T ist und muss nicht erst nochmal nachsehen was
val_t
ist.Wenn du es dagegen machst um z.B. in weiteren Tempaltes die mit
U=Rect<T>
instanziert werden einfachen Zugriff aufT
zu erhalten (übertypename U::val_t
), dann müssteval_t
auch public sein.
-
Und ich dachte,
val_t
wäre intuitiver zu lesen
-
Naja in diesem einfachen Fall wird es Wurst sein. Und du darfst das natürlich machen wie du willst. Ich sage nur ich persönlich finde es komisch im public Interface private Typedefs/Aliase zu verwenden.
-
@hustbaer sagte in Was macht man mit solch einer Fehlermeldung?:
Ich sage nur ich persönlich finde es komisch im public Interface private Typedefs/Aliase zu verwenden.
Das ist ja auch wieder was anderes. Ich wusste nicht, das das komisch ausschaut. Habe das bisher auch nur im public-Bereich gesehen. Weil aber außer der Klasse das sonst niemand benutzen kann, dachte ich, kann ich das auch private machen. Ist halt ein Stück Unerfahrenheit.
-
Und was ist z.B. mit folgendem Code?
Rect<int> r(0, 0, 1, 1); decltype(r)::val_t x = r.left();
-> "error: ‘using val_t = int’ is private within this context", s.a. Ideone-Code.
Oder was @hustbaer meint, z.B.
template<T, U = Rect<T>> do_something(const U &u) { typename U::val_t x = u.left(); // oder genauso decltype(u)::val_t x2 = u.left(); }
(dabei muß
Rect<T>
noch nichteinmal die Standard-Templateklasse sein, dies habe ich nur zur besseren Veranschaulichung hingeschrieben).Also
private: using
(bzw.typedef
) nur für ebenfallsprivate
Member benutzen, oder aber ebensopublic
setzen.
-
Ok, Alles klar. Danke für die Hinweise.
-
@Th69 sagte in Was macht man mit solch einer Fehlermeldung?:
Oder was @hustbaer meint, z.B.
template<T, U = Rect<T>> do_something(const U &u) { typename U::val_t x = u.left(); // oder genauso decltype(u)::val_t x2 = u.left(); }
In dem Fall ginge es ja, weil man eh direkt
T
hat. Ich meinte ehertemplate<class U> void do_something(const U &u) { // U::T geht nicht :( // auto ginge, aber könnte u.U. ein anderer Typ sein (standard promotions etc.) // und es könnte ja sein dass wir aus irgend einem grund genau den selben typ brauchen/haben wollen typename U::val_t foo = (u.right() - u.left()) * 2 + (u.bottom() - u.top()) * 2; // geht :) }