Вот проблема:
template <typename T> T doIt(const T arg); // <---- declared but not defined
int main(int argc, const char* argv[]) {
//...
T s2 = doIt(s); // <------ it is calling above method (which is visible)
}
T doIt(T arg) { // <------ T is `class T`, not `template`, so different method
arg.append(" appended");
return arg;
};
Здесь, когда вы определяете T doIt(T)
после main()
, вы ожидаете, что определяете тело вышеупомянутого template
метода. Что не соответствует действительности. Вы не получите ошибку компилятора, потому что, по совпадению, у вас есть class T
; который пройдет определение T doIt(T)
.
Если вы намереваетесь использовать template doIt
, тогда ваше определение должно быть таким,
template<typename T>
T doIt(T arg) { // <------ T is now `template`; thus same method
arg.append(" appended");
return arg;
};
[Также обратите внимание, что вы получаете ошибку компоновщика, потому что у вас нет реального определения template doIt
, и какое бы определение у вас не было ниже main()
, оно не было видно.]