2012-04-09 9 views
2

Ich arbeite mit der SystemC-Bibliothek, die alle benutzerdefinierten Typen benötigt, um einen Operator < < und sc_trace() -Funktion zu haben. Der benutzerdefinierte Typ ist jedoch tatsächlich ein verschachtelter Typ in einer Schablonenklasse, da der "verschachtelte Typ" aus dem in der äußeren Klasse angegebenen Schablonenargument berechnet wird.Template-Funktion mit verschachtelten Typ kann nicht abgeleitet werden

template<typename T> 
class Block { 
    typedef typename transform<T>::value NewType; 
public: 
    struct SomeType { 
     SomeType() {} 
     SomeType(T val) : member(val) {} 
     NewType member; 
    }; 
}; 

Wenn ich definieren den Operator < < für Sometype wie so

template<typename T> 
std::ostream& operator<<(std::ostream& os, const typename Block<T>::SomeType& type) { 
    return os << type.member; 
} 

Der Compiler den Anruf innerhalb der SystemC-Bibliothek nicht ableiten kann, der versucht hat, die verschachtelt definierten Typs mit den Streaming-Betreiber zu dump. Da ich den Bibliothekscode lieber nicht anfasse (außerhalb meiner Kontrolle). Würde einer von euch Experten da draußen einen Weg finden, um das zu umgehen?

Und wenn es keine saubere Workaround gibt, würden Sie wissen, ob das C++ 11 eine Lösung dafür hat?

+0

Versuchen Sie, das 'typename Block :: SomeType const & type'. – ildjarn

+0

Wo haben Sie Ihren Betreiber definiert? Haben Sie es in Ihrer Header '.h' Datei oder Ihrer Quelldatei' .cpp' definiert? (Dies macht einen Unterschied, wenn es um Templates geht, obwohl C++ 11 das Konzept von [extern template] unterstützt (http://stackoverflow.com/questions/6870885/how-to-use-extern-template)) –

+1

Wenn Sie eine Lösung gefunden haben, fügen Sie sie bitte als Antwort hinzu und markieren Sie sie als akzeptiert. –

Antwort

1

Ich habe selbst eine Lösung gefunden. Es wird als der Barton-Nackman-Trick in Vandevoorde/Josuttis bezeichnet.

Der Schlüssel besteht darin, die Verwendung von Funktionsvorlagen zu vermeiden. Der Standard schließt den geschachtelten Typ einer abhängigen Schablonenklasse von der Schablonenargumentableitung aus. Der Operator < < und die Funktion sc_trace müssen in der Vorlagenklasse als Friend-Funktion definiert werden. Auf diese Weise ist die Funktion eine nicht-templated Funktion, wenn die Vorlagenklasse instanziiert wird, aber mit dem Friend-Schlüsselwort übernimmt die Funktion den Bereich des umschließenden Namespace.

Verwandte Themen