我正在使用SystemC库,它要求所有用户定义的类型都有一个运算符<<和sc_trace()函数。但是,用户定义的类型实际上是模板类中的嵌套类型,因为“嵌套类型”是根据外部类中指定的模板参数计算的。
template<typename T>
class Block {
typedef typename transform<T>::value NewType;
public:
struct SomeType {
SomeType() {}
SomeType(T val) : member(val) {}
NewType member;
};
};
当我定义运算符&lt;&lt;对于SomeType如此
template<typename T>
std::ostream& operator<<(std::ostream& os, const typename Block<T>::SomeType& type) {
return os << type.member;
}
编译器无法推断出使用流操作符尝试转储嵌套定义类型的systemC库中的调用。因为我宁愿不触摸库代码(在我的控制之外)。你们中的任何一位专家都知道如何解决这个问题吗?
如果没有干净的解决方法,你会知道C ++ 11是否有解决方案吗?
答案 0 :(得分:1)
我实际上自己找到了解决方案。它被称为Vandevoorde / Josuttis的Barton-Nackman Trick。
关键是要避免使用功能模板。该标准从模板参数推导中排除了依赖模板类的嵌套类型。运算符&lt;&lt;和sc_trace函数需要在模板类中定义为友元函数。这样,当模板类被实例化时,该函数是一个非模板化的函数,但是使用friend关键字,该函数占据了封闭命名空间的范围。