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