2016-06-27 14 views
2

Lange Geschichte, hier ist das Problem:Wie soll ich meinen Allokator wiederbindbar machen? Kann ich es machen, während ich seine Felder privat halte? kurze

template<class T> 
struct alloc 
{ 
    template<class U> 
    alloc(alloc<U> const &other) : foo(other.foo) { } // ERROR: other.foo is private 
    template<class U> struct rebind { typedef alloc<U> other; }; 
private: 
    pool<T> *foo; // do I HAVE to expose this? 
}; 

ist die einzige Lösung, die privaten Felder öffentlich zu entlarven?
Wie soll man eigentlich den Konvertierungskonstruktor machen?

+0

Es ist sollte möglich sein, durch den Konstruktor macht eine 'friend', aber ich kann nicht die Syntax herauszufinden:/ – Rakete1111

+0

@ Rakete1111: Ich nehme an, Sie bedeuten machen die Klasse ein Freund? Ich glaube nicht, dass man sich überhaupt auf Konstrukteure beziehen kann, geschweige denn versuchen kann, sie zu Freunden zu machen. – Mehrdad

+0

[Aber Konstruktoren können Freunde sein] (http://stackoverflow.com/questions/18310297/can-a-constructor-function-be-a-a-friend-in-c) :) Oder fehlt mir etwas? – Rakete1111

Antwort

3

In Der Vorlagenkopiekonstruktor alloc<T> und alloc<U> sind unterschiedliche Typen, dh Sie können hier nicht auf das private Element alloc<U> zugreifen.

Sie können alloc<U> Freund machen:

template<class T> 
struct alloc 
{ 
    ... ... 
    template <typename U> 
    friend struct alloc; 
    alloc(alloc<U> const &other) : foo(other.foo) {} // possible to access other.foo now 
}; 
+0

Aus irgendeinem Grund dachte ich, eine Vorlage als Freund zu deklarieren wäre illegal. Danke, dass du das unterstrichen hast! – Mehrdad

1

Meine Vermutung ist, dass dies nicht möglich ist, und dass man eigentlich einen Umwandlungsoperator zu verwenden:

template<class U> 
operator alloc<U>() const { return alloc<U>(this->foo); } 

aber ich hoffe, es gibt eine bessere Antwort ...