В C ++ все выражения должны иметь тип, известный компилятору, но в вашем решении lst.begin()->getValue()
не будет иметь никакого конкретного типа.
Хотя, если вы внимательно посмотрите на свой пример, вы не вызываете ValueInterface::getValue()
где угодно, только версии подклассов.
Вы можете попробовать следующее:
class ValueInterface
{
public:
template <typename T>
T getValue() const
{
return dynamic_cast< const Value<T> &>(*this).getValue();
}
virtual ~ValueInterface()
{ }
};
template <typename T>
class Value : public ValueInterface
{
public:
// ...
T getValue() const;
private:
T value_;
};
Обратите внимание, что getValue()
не является (и не может быть) виртуальным.
СейчасВы можете написать код из своего примера, но также:
int z = lst.begin()->getValue<int>();
Если вы используете неправильный тип в вызове getValue
, тогда будет выдано исключение std::bad_cast
.