もすこし、具体的に書きます。
A or Bのconstructorにはdoubleを渡し、
他のclass CのconstructorにBを渡すようにしてあります。
で、B b(1.0)とした後に、
C c(b)とするとcompileが通るのですが、
C c(B(1.0))とすると通らないのです。
Cのmember関数を呼び出すところで、
which is ...のerrorが出ます。
もしかしたらこのmember関数が悪さをしているのかも知れませんが、
cの宣言の違いで結果が変わるため、
constructorあたりが悪いのかと想像しました。