Explicite de spécialisation après l'instanciation

J'ai le code suivant:

typedef vector<int> Vec;
typedef vector<Vec> VecOfVec;

template<typename Vec>
Vec DoSomething(const Vec &v);

template<>
VecOfVec DoSomething<VecOfVec>(const VecOfVec &v)
{
    VecOfVec r;
    for(auto i = v.begin(); i != v.end(); i++)
        r.push_back(DoSomething(*i));
    return r;
}

template<>
Vec DoSomething<Vec>(const Vec &v) //Error here
{
    return v; //for the sake of the example
}

J'obtiens l'erreur suivante:

explicit specialization of 'DoSomething<vector<int> >' after instantiation

à la ligne marquée.
Le compilateur insiste sur le fait qu'il a déjà instancié DoSomething<vector<int> >, alors qu'il ne peut pas, et un programme simple peut le prouver:

typedef vector<int> Vec;
typedef vector<Vec> VecOfVec;

template<typename Vec>
Vec DoSomething(const Vec &v);

template<>
VecOfVec DoSomething<VecOfVec>(const VecOfVec &v)
{
    VecOfVec r;
    for(auto i = v.begin(); i != v.end(); i++)
        r.push_back(DoSomething(*i));
    return r;
}

Résultats en externe non résolu.
Pourquoi le compilateur en disant que c'est déjà instancié quand elle ne peut pas et ne même pas? et pourquoi ne pas le compilateur de traiter comme symbole non résolu, alors que l'éditeur de liens n'?
Je sais que la commutation de la méthode afin de la résoudre, mais je veux savoir pourquoi le compilateur de le faire.

OriginalL'auteur Dani | 2011-10-14