Это не завершено, но вот некоторые мысли для вас, чтобы углубиться, если вы придете к этому позже:
private string CreateWhereClause(Expression<Func<T, bool>> predicate)
{
StringBuilder p = new StringBuilder(predicate.Body.ToString());
var pName = predicate.Parameters.First();
p.Replace(pName.Name + ".", "");
p.Replace("==", "=");
p.Replace("AndAlso", "and");
p.Replace("OrElse", "or");
p.Replace("\"", "\'");
return p.ToString();
}
private string AddWhereToSelectCommand(Expression<Func<T, bool>> predicate, int maxCount = 0)
{
string command = string.Format("{0} where {1}", CreateSelectCommand(maxCount), CreateWhereClause(predicate));
return command;
}
private string CreateSelectCommand(int maxCount = 0)
{
string selectMax = maxCount > 0 ? "TOP " + maxCount.ToString() + " * " : "*";
string command = string.Format("Select {0} from {1}", selectMax, _tableName);
return command;
}
Вы перегрузили оператор умножения. Выньте параметр, чтобы сделать его оператором косвенного обращения.
template<class T>
T list<T>::iterator::operator*()
{
return ((this->lstptr)->current)->data;
}
Вы также должны заставить его возвращать ссылку, если вы хотите, чтобы код типа * IT = 3;
компилировался.
template<class T>
T& list<T>::iterator::operator*()
{
return ((this->lstptr)->current)->data;
}
У вас здесь две проблемы; во-первых, вы случайно перегрузили оператор умножения, а не оператор разыменования; во-вторых, вы не вернули ссылочный тип.
Первая проблема возникает из-за количества параметров. Каждая нестатическая функция-член класса имеет дополнительный «скрытый» параметр: this
. this
, конечно же, указатель на объект, для которого функция вызывается. В результате вы фактически объявили версию оператора с двумя параметрами. Удалив второй параметр итератора и работая с this
, вы перегрузите унарный *
, а не двоичный.
Вторая проблема - это второстепенная проблема возвращаемого типа; вы возвращаете копию исходному объекту, а не сам исходный объект. Объявите возвращаемый тип как T &
, чтобы вернуть ссылку.