Я получаю сообщение об ошибке, связанное с использованием одного и того же класса, но с разными типами int и char

template <typename ItemType>
int Infix::performOp(LinkedStack<ItemType> valueStack, LinkedStack<ItemType> operatorStack)

ValueStack - это целое число, а operatorStack - это символ.

Когда я компилирую это примечание, оно прикрепляется к ошибке.

template argument deduction/substitution failed:

За которым следует это примечание

deduced conflicting types for parameter ‘ItemType’ (‘int’ and ‘char’)

Возможно ли наличие нескольких типов одного и того же класса в одном определении функции?

c++
0
Eli D. 13 Мар 2018 в 06:32

2 ответа

Лучший ответ

Когда вы используете

template <typename ItemType>
int Infix::performOp(LinkedStack<ItemType> valueStack,
                     LinkedStack<ItemType> operatorStack) { ... }

Оба valueStack и operatorStack должны быть одного типа.

Если operatorStack не может иметь тип, отличный от LinkedStack<char>, вы можете использовать:

template <typename ItemType>
int Infix::performOp(LinkedStack<ItemType> valueStack,
                     LinkedStack<char> operatorStack) { ... }

Если вашей функции не требуется вносить изменения в аргументы, я бы предложил сделать аргументы const&.

template <typename ItemType>
int Infix::performOp(LinkedStack<ItemType> const& valueStack,
                     LinkedStack<char> const& operatorStack) { ... }
0
R Sahu 13 Мар 2018 в 03:53

У вас не может быть определенного template аргумента, который работает более чем с одним типом в вызове; думайте, что это похоже на попытку использовать один и тот же аргумент функции для нескольких значений в одной и той же ситуации.

Решение - использовать несколько аргументов template:

template <typename ItemType1, typename ItemType2>
int Infix::performOp(LinkedStack<ItemType1> valueStack,
                     LinkedStack<ItemType2> operatorStack)
0
Stephen Newell 13 Мар 2018 в 03:37