Здравствуйте, rg45, Вы писали:
R>Ну вот это неочевидный вывод, для меня, по крайней мере. Если при перемещении определения шаблона функции из срр-файла в заголовок будет меняться видимое поведение программы, то это уже действительно странно.
Чего тут странного. Поведение не должно меняться.
template<class T> void f0(T&);
template<class T> void f1(T&) {}
inline void f0i(int x) { f0(x); }
inline void f1i(int x) { f1(x); }
//...
// template<> void f1(int&) {} // ошибка, уже есть реализация, полученная при инстанцировании
// template<> void f0(int&) {} // ошибка, просто за компанию. реализаци не ну и пофиг всё равно нельзя.
Надо явно компилятору дополнительно пальцем тыкать. Как буд-то он не в курсе что у него нет никакой дефолтной имлементации.
template<class T> void f0(T&);
template<class T> void f1(T&) {}
template<> void f0(int &); inline void f0i(int x) { f0(x); }
inline void f1i(int x) { f1(x); }
//...
// template<> void f1(int&) {} // ошибка, уже есть реализация, полученная при инстанцировании
template<> void f0(int&) {} // теперь можно
Разве не видно неконсистентность?