Por padrão, use funções com espaço para nome.
As classes são para criar objetos, não para substituir espaços para nome.
No código Orientado a Objetos
Scott Meyers escreveu um item inteiro para seu livro Effective C ++ sobre este tópico, "Prefira funções de não-membro não-amigo a funções de membro". Encontrei uma referência on-line a esse princípio em um artigo da Herb Sutter:http://www.gotw.ca/gotw/084.htm
O importante é saber: No C ++, as funções no mesmo espaço de nomes que uma classe pertencem à interface dessa classe (porque o ADL pesquisará essas funções ao resolver chamadas de função).
Funções com espaço para nome, a menos que declarado "amigo", não têm acesso aos internos da classe, enquanto métodos estáticos.
Isso significa, por exemplo, que, ao manter sua classe, se você precisar alterar os componentes internos da sua classe, precisará procurar efeitos colaterais em todos os seus métodos, incluindo os estáticos.
Extensão I
Adicionando código à interface de uma classe.
Em C #, você pode adicionar métodos a uma classe, mesmo se você não tiver acesso a ela. Mas em C ++, isso é impossível.
Mas, ainda em C ++, você ainda pode adicionar uma função com espaço para nome, mesmo para uma classe que alguém escreveu para você.
Veja do outro lado, isso é importante ao projetar seu código, porque, ao colocar suas funções em um espaço para nome, você autorizará seus usuários a aumentar / concluir a interface da classe.
Extensão II
Um efeito colateral do ponto anterior, é impossível declarar métodos estáticos em vários cabeçalhos. Todo método deve ser declarado na mesma classe.
Para espaços para nome, funções do mesmo espaço para nome podem ser declaradas em vários cabeçalhos (a função de troca quase padrão é o melhor exemplo disso).
Extensão III
O frescor básico de um espaço para nome é que, em algum código, você pode evitar mencioná-lo, se você usar a palavra-chave "using":
#include <string>
#include <vector>
// Etc.
{
using namespace std ;
// Now, everything from std is accessible without qualification
string s ; // Ok
vector v ; // Ok
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
E você pode até limitar a "poluição" a uma classe:
#include <string>
#include <vector>
{
using std::string ;
string s ; // Ok
vector v ; // COMPILATION ERROR
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
Esse "padrão" é obrigatório para o uso adequado do idioma de troca quase padrão.
E isso é impossível de se fazer com métodos estáticos nas classes.
Portanto, os namespaces do C ++ têm sua própria semântica.
Mas vai além, pois você pode combinar espaços para nome de maneira semelhante à herança.
Por exemplo, se você tiver um espaço para nome A com uma função AAA, um espaço para nome B com uma função BBB, poderá declarar um espaço para nome C e trazer AAA e BBB nesse espaço para nome com a palavra-chave using.
Conclusão
Os espaços para nome são para espaços para nome. As aulas são para aulas.
O C ++ foi projetado para que cada conceito seja diferente e seja usado de maneira diferente, em casos diferentes, como uma solução para diferentes problemas.
Não use classes quando precisar de espaços para nome.
E no seu caso, você precisa de espaços para nome.