3

我正在使用 SystemC 库,它要求所有用户定义的类型都具有 operator<< 和 sc_trace() 函数。然而,用户定义的类型实际上是模板类中的嵌套类型,因为“嵌套类型”是根据外部类中指定的模板参数计算得出的。

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

我实际上自己找到了解决方案。它在 Vandevoorde/Josuttis 被称为 Barton-Nackman 技巧。

关键是避免使用函数模板。该标准从模板参数推导中排除了依赖模板类的嵌套类型。operator<< 和 sc_trace 函数需要在模板类中定义为友元函数。这样,当模板类被实例化时,该函数是一个非模板化函数,但使用friend关键字,该函数占据了封闭命名空间的范围。

于 2012-04-10T16:54:37.013 回答