スマートポインターとベクトルを操作するために2つのヘルパー構造体を使用しています
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
trueを生成します。ただし、テンプレート化された関数(実際にはオペレーター)があります。これは、使用時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)を異なる方法で処理するのはなぜですか?