c ++ 11 — ошибка C ++ C2228 (слева от ‘.val’ должен быть класс / структура / объединение) в необычных обстоятельствах

В 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);
}
};

4

Решение

Похоже, у вас большое недопонимание по поводу этой строки:

T = NewT;

В C ++ T является параметром шаблона и поэтому он статичен во время компиляции. Вы не можете «установить» его, так как он не является переменной. В отличие от некоторых динамических языков (Python, …) в C ++ типы не являются объектами и не могут быть изменены во время выполнения. Вы можете создать экземпляр шаблона с разными типами (разные Ts), но каждый подобен отдельному классу (называемому экземпляром класса шаблона или экземпляром шаблона класса, оба эквивалентны), и он не зависит от других экземпляров.

Поскольку остальная часть вашего дизайна основана на вышеупомянутом ложном допущении, вы сталкиваетесь с множеством проблем. Причина, по которой вышеприведенная строка не отображается в качестве первой ошибки, заключается в том, что она даже не создается до того, как скомпилирована другая часть кода (технически: разные этапы компиляции). Тем не менее, вы должны понимать, почему вышесказанное невозможно в C ++, а остальное последует. Возможно, вы захотите взглянуть на другие реализации, такие как Boost.Any, чтобы получить некоторые идеи о том, как это можно сделать. (Предупреждение: это сложнее, чем ваш подход)

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]