I think I see what you mean.
The trouble may be that the OP seemed to need help understanding that a TSubClassOf property does not store a reference to any existing object. It stores a class type, not an object that is of that class or derived classes. This means — and I say this cautiously — that you can’t call functions or access variables on a TSubClassOf property itself. This is the reason the OP saw the listed error, though the error text does a poor job of communicating the exact problem.
This is also why some of us answered saying that one has to have an instance to call the Fire() function on: to address the fact that the OP was calling Fire() on UCLASS type rather than an instantiated weapon in the game.
Of course, as you correctly pointed out, one doesn’t always have to spawn or otherwise retrieve access to an existing object to call functions pertaining to that class. As you said, that’s what the CDO is for. And again, there are countless uses for the CDO. Everyone should be aware of it, for sure.
But this is maybe where I’ll get myself in trouble. In this case, the OP had a specific goal in mind, and we tried to address that and issue answers specific to it. The CDO would not have helped the OP, regardless of the chosen wording of the question title. We can all try to answer as generically as possible, but sometimes you gotta get specific to get your point across. In this case, the OP had a “manager” class that would call Fire() on the equipped weapon. It appeared that the OP didn’t understand the need to hold a pointer somewhere to the currently equipped weapon. So we tried to address that. As it turned out, the OP probably didn’t actually need to use the TSubClassOf property at all to achieve the stated goal, adding to the confusion. A simple pointer (of type ABaseWeapon) to the currently equipped weapon would do the trick of exposing the weapon’s Fire() function.
Anyway, maybe we simply disagree about which information the OP actually needed.