Zaczynając: .h i .cpp to rozszerzenia. .cpp są kompilowane. Kiedy dołączasz coś przez #include, nie ma znaczenia, czy to .h, czy .cpp. #include to dosłownie copy-paste. To tak jakbyś zawartość A wkleił w miejscu #include <A>.
Przecież w ten sposób załączamy do pliku z gotowymi definicjami plik z samymi deklaracjami
Co do samych funkcji, zgadza się, definicja funkcji nie potrzebuje deklaracji. Ale już taka definicja metody klasy potrzebuje definicję klasy, która zazwyczaj jest w nagłówku. Ogólnie zależności są na tyle złożone, że zawsze w A.cpp powinno się include'ować A.h, bo w 99% kod bez tego się nie skompiluje, a w pozostałym 1% to wciąż może doprowadzić do konfuzji w przyszłości.
Więc spróbowałem sposobu takiego
w mainie includuję plik .h
w pliku .h includuję plik .cpp
i voila, działa!
Twój plik .cpp (poza byciem niezależnie kompilowanym) z punktu widzenia main.cpp jest tylko kolejnym nagłówkiem. Rezultat taki jak gdybyś wrzucił kod szablonu do .h, tylko gorzej, bo jest dodatkowo kompilowany i robi się dziwnie. Ogólnie sprowadza się to do tego że
- nie include'uj .cpp
- nie wrzucaj implementacji szablonów "nagłówkowych" do .cpp
Czemu z rozmieszczeniem szablonów w plikach musi być tak niestandardowo?
Nie rozumiem pytania.
Wyjaśniłby ktoś w miarę dokładnie i zarazem łopatologicznie jak to jest z tą kompilacją i linkowaniem?
Wpisz "compiler linker" w google images. Obrazek mówi więcej niż tysiąc słów. Na przykład https://devblogs.nvidia.com/wp-content/uploads/2014/04/separate_compilation_linking.png . Jak nadal masz pytania, to pytaj.