我正在使用两个辅助结构来处理智能指针和向量
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) 的处理方式不同?