You still don't get why user-defined literals will help. Even with that Ogre system, you are passing dimensionless values to get converted to some angle object or to be interpreted in whatever way you specify. Does it prevent you from passing 90.0 to a function that takes an angle in radians? Not really, because you need to construct the radian angle using a value as well. If you use user-defined literals, you are forced to explicitly write the unit as part of the value you specify hence making it 100% clear you are passing an angle in the specified unit.
You might disable implicit conversion and force people to write stuff like .setAngle( Degrees( 90.0 ) ) but at what cost? You create a temporary just to make it look safer than it actually is? Someone might end up doing something stupid like .setAngle( Degrees( m_angle ) ) and set m_angle somewhere else, defeating the purpose of making it clear what the unit is. Yes... some programmers are really that dull. With user-defined literals, there is the possibility to use constexpr to make the compiler evaluate the value already at compile time thus eliminating any run-time overhead that might be incurred using temporaries.
If you aren't content with a user-defined literal just evaluating to a POD with known unit type because of those ninja conversion errors, then make it evaluate to an angle. And better still, make it impossible to construct such an angle in any other way than through a literal or any safe construction methods (like copying). That way, you force people not to be lazy and do things like .setAngle( Degrees( m_angle ) ).
Take sf::Time for example. Someone could write something like sf::sleep( sf::seconds( m_sleep_time ) ) in their main. In some other file at line 1337, they might set m_sleep_time to 1000. Do they realize that they have committed an error? No, because they were lazy, and nothing about sf::Time will prevent it from happening.
If, however, they had to construct the sf::Time using a user-defined literal every time, they wouldn't be allowed to do stupid things like that because they would need to set m_sleep_time to 1000_ms and call sf::sleep( m_sleep_time ) hence eliminating that error source.
I'm against adding extra classes/types just to prevent errors, especially since the language provides facilities that can make it impossible even for the most dull of programmers to make stupid mistakes. If there is a weak point in any solution you always have to count on it being its undoing. And to add insult to injury, you add potential runtime overhead as well.