2016-10-20 2 views
2

Я пытаюсь использовать метод Contains() класса шаблона, но получаю странную ошибку преобразования аргументов.Компилятор, похоже, меняет свой параметр const

ошибка C2664: 'BOOL DynamicArray :: Содержит (константный Е) сопзИ' : не может преобразовать аргумент 1 из 'сопзИте Совместных *' к 'Объединенных * сопзИте' с Е = Joint
Конверсия теряет отборочные

Вот соответствующий код класса шаблонов.

template <class E> 
class DynamicArray 
{ 
    bool Contains (const E element) const; 

    // Other code... 
}; 

template <class E> 
bool DynamicArray<E>::Contains(const E element) const 
{ 
    // Other code... 
} 

призыв к Содержит способ сделать так, здесь

bool ASMState::AnimatesJoint(const Joint* pJoint) const 
{ 
    return m_animatedJoints.Contains(pJoint); 
} 

кода соответствующего класса шаблона в ASMState.h

class ASMState 
{ 
    DynamicArray<Joint*> m_animatedJoints; 

    // Other members... 

    bool AnimatesJoint(const Joint* pJoint) const; 

    // Other methods... 
}; 

Если удалить сопзЬ в функции AnimatesJoint подписи например, bool ASMState::AnimatesJoint(Joint* pJoint) const, тогда код компилируется. Я хотел бы сохранить const, если можно, но я не знаю, почему этот параметр, похоже, изменился с того, что я написал. То есть от const Joint * до Joint *const согласно компилятору.

Я использую Visual Studio 2013 Express,

+1

Вопрос не является дубликатом, так как проблема, связанная с ошибкой компилятора, не решена одним из связанных потоков. Это не преобразование 'Joint *' to 'Joint * const', которое приводит к ошибке, но недействительное преобразование' Joint const * 'to' Joint * '. И последняя проблема не отличается от любого другого (не указателя) типа. – davidhigh

ответ

1

Ваш шаблон класса DynamicArray выводит тип E в Joint *, и в функции члена Contains вы в принципе добавить const к нему. Теперь, как было упомянуто в комментариях и уже указано ошибкой компилятора, это не приводит к const Joint* (что совпадает с Joint const*), а скорее к Joint * const - добавление const не соответствует текстовой замене, где вы 'просто замените E на ваш тип указателя.

Однако проблема заключается не в добавлении const к типу указателя, который выполняет функция Contains, так как это действие допускается. Проблема скорее в том, что вы передаете const-указатель на функцию Contains, но на самом деле он ожидает указатель не const const - это отличное от const Joint* до Joint *, которое запрещено.

Именно поэтому удаление const в Contains(const E) не решит эту проблему. Тем не менее я бы настоятельно рекомендовал это сделать, потому что принятие параметра по const-value почти никогда не бывает полезным.

Скорее, как вы уже писали, вам необходимо удалить const в функцию AnimatesJoint(const Joint* pJoint).

-2

Кажется, что bool Contains (const E element) const ожидает ввода типа const E, в то время как в

return m_animatedJoints.Contains(pJoint); 

вы передаете ввод типа const E *, другими словами, указатель. Возможно, решение изменить эту строку:

return m_animatedJoints.Contains(*pJoint); 

Я предполагаю, что ошибка, которую вы получаете, потому что компилятор пытается передать вход pJoint в const E где E = ... * const, т.е. постоянный указатель.

+0

Вы знаете, как работает дедукция типа? –

Смежные вопросы