Looking at the code, I think the code smell is that you've blown out all of your template instantiation in that huge two dimensional array, and between that and template parameters such as A/B/C/D/E/F, it is very difficult to follow what is going on.
Also, I'm not familiar with this view stuff... is this new? (i.e. - <5 years old? ;-))
I think that it does make a great deal of sense to do view setup up front in device_start(), but it looks like you're trying to do even more up front by populating m_all_ram_maps and m_ram_rom_p0_maps in the constructor. Given that device_start() only happens once in an emulation session, it isn't clear to me what this buys you, and it really obscures that is going on.
Instead of having "uber templates" that do everything (all_ram_map, ram_rom_map, ram_rom_map_p1, ram_read) for swathes of the address space, I'd favor smaller templates that "governed" specific slices of memory ($0000-$0FFF, $1000-$1FFF, $2000-$3FFF etc) and had set up the right thing based on well named template arguments (i.e. - not single letters). And instead of creating a big lookup table, use switch/case statements to select the right template when setting up the view.
Of course, its highly likely I might be missing something.