Явная специализация после создания экземпляра

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

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 > , в то время как он не может, и простая программа может это доказать:

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

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

13
задан Dani 14 October 2011 в 22:21
поделиться