Something went wrong with your code post, it seems most of it got crammed onto a few lines instead of properly spaced out.
Anyways, the idea for larger tiles is, you have to draw the regular size tiles first or your draw calls with be overlapped in ways you don't want. You can conveniently cheat and draw them at the same time (in one iteration over your tile grid), if you offset your large tiles so they always overlap to the north and to the west, (assuming you draw from north-to-south and left-to-right) because you've already drawn those tiles earlier in your iteration.
If you draw a regular tile at (x,y), you can then position larger tiles at (x - (imageWidth-tileWidth)), and (y - (imageHeight - tileHeight)).
This can be simplified for all your tiles like this:
1) Calculate grid position, using the lower-right corners of the grid cells instead of the upper-left.
2) From the lower-right cell corner, subtract the drawn image's width and height.
That'll work for tiles of any size.
//For every tile...
for(int tileY = 0; tileY < MapHeight; ++tileY)
{
for(int tileX = 0; tileX < MapWidth; ++tileX)
{
//Get the tile image.
const TileImage &tileImage = map[(tileY * MapWidth) + tileX];
//Calculate the grid position.
Point gridPos = Point(tileX * GridCellWidth, tileY * GridCellHeight);
//Offset based on the tile's size, regardless of that size.
Point offset = Point(tileImage.width, tileImage.height);
//Get the final position.
Point tilePosition = (gridPos - offset);
//Draw at the correct position.
Draw(destination, tileImage, tilePosition);
}
}