In C++, this line is ill-formed:
mainm.cells[] = { "Dispositivos de Entrada", "Dispositivos de Saida", "Dispositivos de Entrada e Saida" };
When you declare arrays, you may use [] to signify the fact, but when it isn't part of a declaration, and you aren't indexing it, you shouldn't use [] at all when referring to the array.
(As Jonathan Potter points out, the struct definition is also ill-formed:
typedef struct {
string title;
string cells[];
} menu;
Think about it -- if this is supposed to be a complete definition of the menu structure, then taking its size with sizeof should be possible. But if the size of cells has not been determined yet then it isn't possible yet.
You can use [] without specifying a size, when you are initializing the array with a list of items, because then the compiler will just count the items for you. But if you aren't doing that, it's not going to work.)
Changing your code to
mainm.cells = { "Dispositivos de Entrada", "Dispositivos de Saida", "Dispositivos de Entrada e Saida" };
gives a more intelligible error message:
http://coliru.stacked-crooked.com/a/6279ed5446008616
main.cpp:16:17: error: assigning to an array from an initializer list
When you are initializing an array, you can use the braced expressions initialization form, but after initialization, you can't do that anymore, you need to use a loop, or memcpy or something.
If you are on C++11 standard, and you use a vector instead of an array, you can do something pretty close to what you wanted, like this: http://coliru.stacked-crooked.com/a/e7d6964388bf42ac
Or if you want to stick with arrays you could use std::array and use std::copy to initialize it by copying, like here. http://coliru.stacked-crooked.com/a/3caac3676c94d913
std::vector<std::string>instead.