1

我正在使用两个辅助结构来处理智能指针和向量

template<typename T>
struct Pointer {
    typedef shared_ptr<T> type;
};

template<typename T>
struct Vector {
    typedef vector<T, allocator<T>> type;
};

在这种情况下很明显,表达式

is_same<
    vector<
        shared_ptr<T>,
        allocator<shared_ptr<T>>>,
    Vector<
        Pointer<T>::type>::type>
::value

产生真实的。但是,我现在有一个模板化函数(实际上是一个操作符),它在使用Vector<Pointer<T>::type>::type或通常处理时会有所不同vector

// (1) General version
template<typename T>
Foo& operator&(T& object);

// (2a) Specialized version
template<typename T>
Foo& operator&(vector<shared_ptr<T>, allocator<shared_ptr<T>>>& object);

// (2b) Specialized version which does not work
template<typename T>
Foo& operator&(typename Vector<typename Pointer<T>::type>::type& object);

在我的代码中有 (2a) 时调用此运算符按预期工作。但是,当我将 (2a) 替换为 (2b) 时,编译器/链接器会尝试将调用与 (1) 匹配,这对我来说会产生链接错误,因为 (1) 对向量没有定义/有效。为什么编译器对 (2a) 和 (2b) 的处理方式不同?

4

1 回答 1

5

因为编译器无法推断(2b)中的类型。问题是它可以匹配

vector<shared_ptr<T>,allocator<shared_ptr<T>>>

因为那是要匹配的“只是一种类型”。对于任何给定的参数,它只检查是否存在 aT并且类型匹配。编译器只需要测试一个选项。为了

typename Vector<typename Pointer<T>::type>::type

编译器将不得不尝试 all Tfor withVector<...>::type会产生所需的类型,但它不会这样做。如果可能的话,这种分析将比仅匹配直接类型复杂得多。

于 2013-03-25T12:55:18.207 回答