3

私は、すべてのユーザー定義型に operator<< および sc_trace() 関数が必要な SystemC ライブラリを使用しています。ただし、「ネストされた型」は外側のクラスで指定されたテンプレート引数から計算されるため、ユーザー定義型は実際にはテンプレート クラス内のネストされた型です。

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

そのように SomeType の operator<< を定義すると

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

コンパイラは、ストリーミング演算子を使用してネストされた定義済みの型をダンプしようとする systemC ライブラリ内の呼び出しを推測できません。私はむしろライブラリコードに触れていないので(私の制御外)。あなたの専門家の中で、これを回避する方法を知っている人はいますか?

また、明確な回避策がない場合、C++11 にこれに対する解決策があるかどうか知っていますか?

4

1 に答える 1

2

私は実際に自分で解決策を見つけました。これは、Vandevorde/Josuttis では Barton-Nackman Trick と呼ばれています。

重要なのは、関数テンプレートの使用を避けることです。標準では、依存テンプレート クラスのネストされた型をテンプレート引数推定から除外しています。operator<< および sc_trace 関数は、テンプレート クラスでフレンド関数として定義する必要があります。このように、テンプレート クラスがインスタンス化されると、関数はテンプレート化されていない関数になりますが、friend キーワードを使用すると、関数は外側の名前空間のスコープを取得します。

于 2012-04-10T16:54:37.013 に答える