arseniiv, если реализовать функцию в теле класса, то компилятор сам добавляет неявный inline к её определению. На то есть причина. Когда заголовочный файл с классом включается в несколько разных файлов, каждый объектный файл после компиляции несёт в себе определения всех функций. Компоновщик выдаёт ошибку, если он обнаруживает несколько определений (не объявлений, а именно определений) одного и того же символа (функции). Но если компоновщик видит несколько определений одного символа помеченных inline, он выбирает какое-то одно, а остальные молча выбрасывает.
inline - это директива компоновщику в первую очередь и необязательный намёк компилятору во вторую.
Определения функций в теле класса без inline бесполезны. Чтобы исправить проблему компилятор добавляет inline сам. А программисты изыскивают методы запретить этот автоматический inline. Хотя чтобы запретить его достаточно вынести определение функции из класса.
Вот демонстрация проблемы. Я не могу отменить inline внутри класса, но я могу сымитировать ситуацию вынеся определение функции из класса без inline. Ошибка проявляется немедленно:
с.h:
class C { void m(); };
/* inline */ void C::m() {}
a.cpp:
#include <c.h>
int main() {}
b.cpp:
shell:
Код:
+~/tmp/no_inline $ g++ -I. a.cpp b.cpp
/tmp/ccrb2IQN.o: In function `C::m()':
b.cpp:(.text+0x0): multiple definition of `C::m()'
/tmp/ccFdgZug.o:a.cpp:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status