Явная специализация после создания

У меня есть следующий код:

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
}

Я получаю следующую ошибку:

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

на отмеченной линии.
Компилятор настаивает на том, что он уже созданDoSomething<vector<int> >Пока это невозможно, и простая программа может доказать это:

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;
}

Результаты в нерешенной внешней.
Почему компилятор говорит, что уже создал его, когда не может, а может и нет? и почему компилятор не рассматривает его как неразрешенный символ, в то время как компоновщик это делает? Я знаю, что переключение порядка методов решает это, но я хочу знать, почему это делает компилятор.

Ответы на вопрос(2)

Ваш ответ на вопрос