В C ++ я пытаюсь реализовать свой собственный any
класс с использованием C ++. Однако, прежде чем я смог протестировать его (поэтому, если моя реализация плохая, не стесняйтесь исправлять меня), я получил ошибку: error C2228: left of '.val' must have class/struct/union
дважды от использования value()
функция дважды, что кажется странным, когда работает везде. Единственное, о чем я мог подумать, это decltype
Инфронт функции вызывает ошибку, но не должен:
Изменить: я обновил способ изменения переменной для template<class T> any(T V){...}
конструктор
class any{
protected:
template<class T> struct variable{
public:
T val;
variable(){}
variable(T t) : val(t){}
};
variable<int> v;
public:
any(){
v.val = 0;
}
template<class T> any(T V){
variable<T> nV(V);
v = nV;
}
~any(){
delete &v;
}
decltype(v.val) value(){ // Error still here
return v.val;
}
template<class T> static any create(T V){
return any(V);
}
};
Похоже, у вас большое недопонимание по поводу этой строки:
T = NewT;
В C ++ T
является параметром шаблона и поэтому он статичен во время компиляции. Вы не можете «установить» его, так как он не является переменной. В отличие от некоторых динамических языков (Python, …) в C ++ типы не являются объектами и не могут быть изменены во время выполнения. Вы можете создать экземпляр шаблона с разными типами (разные T
s), но каждый подобен отдельному классу (называемому экземпляром класса шаблона или экземпляром шаблона класса, оба эквивалентны), и он не зависит от других экземпляров.
Поскольку остальная часть вашего дизайна основана на вышеупомянутом ложном допущении, вы сталкиваетесь с множеством проблем. Причина, по которой вышеприведенная строка не отображается в качестве первой ошибки, заключается в том, что она даже не создается до того, как скомпилирована другая часть кода (технически: разные этапы компиляции). Тем не менее, вы должны понимать, почему вышесказанное невозможно в C ++, а остальное последует. Возможно, вы захотите взглянуть на другие реализации, такие как Boost.Any, чтобы получить некоторые идеи о том, как это можно сделать. (Предупреждение: это сложнее, чем ваш подход)
Других решений пока нет …