无法推导出具有嵌套类型的模板函数

时间:2012-04-09 21:12:50

标签: c++ templates c++11 resolution

我正在使用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是否有解决方案吗?

1 个答案:

答案 0 :(得分:1)

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

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