Wygląda na to, że jeszcze nie do końca rozumiesz ideę przestrzeni nazw.
Plik conio.h to jest tylko plik - czyli fizyczne miejsce, w którym zapisany jest pewien fragment kodu źródłowego. To zupełnie inna sprawa, niż przestrzeń nazw - tutaj to już nie jest jakaś fizyczna przestrzeń, tylko nieco abstrakcyjna.
Możesz zdefiniować własną przestrzeń nazw, np. moja_przestrzen i w niej będą się zawierały Twoje funkcje i klasy, np.
// plik a.h
#pragma once
namespace moja_przestrzen
{
class Klasa
{
public:
Klasa();
};
double sin(double arg);
}
Możesz deklarację reszty swoich funkcji i klas mieć w innym pliku niż powyższe, ale nadal będą się one znajdować w Twojej przestrzeni nazw, oczywiście jeśli przydzielisz je do niej.
I jeśli tylko zaincludujesz w kodzie odpowiedni nagłówek, to będziesz miał dostęp do swoich funkcji czy klas, ujętych w przestrzeni moja_przestrzen.
#include <cmath>
#include <iostream>
#include "a.h"
int main()
{
std::cout<<"Sinus z 3.14 z biblioteki standardowej: "<<std::sin(3.14)<<'\n';
std::cout<<"Sinus z 3.14 z mojej biblioteki: "<<moja_przestrzen::sin(3.14);
return 0;
}
Dla kompilatora nie ma żadnego znaczenia, czy Twój plik nagłówkowy to *.h, czy *.hpp. Dla niego liczy się tylko kod tam zawarty. Tak na marginesie - kompilator nawet nie ma pojęcia bladego o żadnych nagłówkach ani niczym takim - tym zajmuje się preprocesor.
Autorzy zrobili rozgraniczenie na pliki *.h i resztę ze względu korzeni języka C++. Nagłówek conio.h pochodzi jeszcze z C, gdzie nie istniał mechanizm przestrzeni nazw. Chodzi tutaj o bibliotekę standardową. Nagłówki *.h z biblioteki standardowej w C++ pochodzą z C i nie powinny być używane - teraz zastąpiły je odpowiednio nagłówki z "c" na początku i bez rozszerzenia, np.
math.h - nagłówek z C, niezalecany w C++
cmath - poprawny nagłówek dla C++