I would have a list of tile definitions, each having a pointer to the texture it uses.
Each tile would contain only an index to the tile definition (tile type)
When rendering you get the texture from the tile definitions using the tiles index thing.
The textures can be stored separately, in a manager, whatever works.
That is how I've done it in the past. The tile_layer class had a 2D array of unsigned longs, each an index into the texture list. There wasn't a tile class. However, I am breaking that tried and true method and allowing tiles to be any shape and size, as well as having the ability to move and be animated. It complicates things quite a bit. The tiles are composed of 3D meshes, and may have diffuse, normal and specular maps, along with various shaders, as needed. It isn't easy (possible?) to do a simple assignment as I have previously done.
I think HappyCoder said it best. I think I am complicating things more than I need to with the resource allocation. I'm going to rethink this a bit.