Просто добавьте что-то примечательное здесь.
myQueue.hpp:
template <class T>
class QueueA {
int size;
...
public:
template <class T> T dequeue() {
// implementation here
}
bool isEmpty();
...
}
myQueue можно определить методы шаблонного класса, которые просто прекрасны в файле реализации. cpp:
// implementation of regular methods goes like this:
template <class T> bool QueueA<T>::isEmpty() {
return this->size == 0;
}
main()
{
QueueA<char> Q;
...
}
В декларативных парадигмах инстанцирование невозможно (если вы не используете datafact или что-то подобное), поэтому способ решить вашу проблему - объявить, что пустой список имеет размер 0:
list([],0) :- !.
list([A|B], X1) :- list(B, X0), X1 = X0 + 1.
Таким образом, вы знаете, что длина списка L равна 1+ (длина хвоста L )
Относительно этой части Вашего примера кода:
X = X + 1
Очень распространенная ошибка для людей, плохо знакомых с Прологом. `` = '' В Прологе означает «то же, что и». Следовательно, приведенный выше фрагмент кода объявляет «X такой же, как X + 1». По крайней мере, это должно быть:
X = Y + 1
Однако это не совсем то, что Вам нужно, потому что:
?- Y = 2 , X = Y + 1 .
X = Y + 1
Y = 2
Для того, чтобы Пролог поставил результат математики вычисление с правой стороны в переменную с левой стороны, используйте _lhs_ is _rhs_
.
?- Y = 2 , X is Y + 1 .
X = 3
Y = 2
В отношении вопроса
How can I check if X has a value before doing an increment to it.
when(ground(_variable_),(_thing_to_do))
- лучший из доступных вариантов.
Вот пример решения общей проблемы, поставленной в том, что использует некоторые из этих концепций.
goal_expansion((_lhs_ =:= _rhs_),(when(ground(_rhs_),(_lhs_ is _rhs_)))) .
:- op(2'1,'yfx','list') .
_list_ list [size:_size_] :-
_list_ list [size:_size_,shrink:_shrink_] ,
_list_ list [size:_size_,shrink:_shrink_,size:_SIZE_] .
_list_ list [size:0,shrink:false] .
_list_ list [size:_size_,shrink:true] :-
when(ground(_size_),(_size_ > 0)) .
[] list [size:0,shrink:false,size:0] .
[_car_|_cdr_] list [size:_size_,shrink:true,size:_SIZE_] :-
(_SIZE_ =:= _size_ - 1) ,
(_size_ =:= _SIZE_ + 1) ,
_cdr_ list [size:_SIZE_] .
/*
?- L list Z .
L = [],
Z = [size:0] ? ;
L = [_A],
Z = [size:1] ? ;
L = [_A,_B],
Z = [size:2] ? ;
L = [_A,_B,_C],
Z = [size:3] ?
yes
?- L list [size:0] .
L = [] ? ;
no
?- L list [size:1] .
L = [_A] ? ;
no
?- L list [size:2] .
L = [_A,_B] ? ;
no
?- [] list [size:S] .
S = 0 ? ;
no
?- [a] list [size:S] .
S = 1 ? ;
no
?- [a,b] list [size:S] .
S = 2 ? ;
no
?- [a,b,c] list [size:S] .
S = 3 ? ;
no
?-
*/