The compiler is only allowed to make implicit type conversions from 1 type.
Due to that reason, your first code works fine:
1 2 3 4 5 6 7 8 9
Image::Image(UINT resourceID);
Image::Image(HMODULE hMod, UINT resourceID);
Surface::Surface(CONST Image& image);
// 1 parameter
Surface * s = new Surface(someResourceID);
// 2 parameter
Surface * surface = new surface(someHModule, someResourceID);
Image has a 1-parameter constructor that is not declared explicit, therefore the compiler is allowed to invoke the int-parameter-constructor implicitly.
That means that your compiler convertes this code: Surface * s = new Surface(someResourceID);
to this one: Surface * s = new Surface(Image(someResourceID));
In your second example, you have 2 parameter.
The compiler is not allowed to make an implicit type conversion here and therefore the compilation fails.
To make the second line successful construct the image explicitly like this:
Surface * surface = new surface(Image(someHModule, someResourceID));
In c++11 you can make it with an initializer list: (note the brackets {}) Surface * surface = new surface({someHModule, someResourceID});