У меня есть следующий код:
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;
}
Результат - нерешенное внешнее.
Почему компилятор говорит, что уже создал его, когда не может, а может и нет? и почему компилятор не рассматривает его как неразрешенный символ, в то время как компоновщик это делает?
Я знаю, что переключение порядка методов решает его, но я хочу знать, почему компилятор делает это.