У меня есть проблема с шаблонами:станд :: is_base_of и ошибка, если
У меня два конструктора и метода: .cpp:
Cell::Cell(sf::Vector2i& uPos, sf::Vector2f& cellDimensions, std::string& stateName)
:unitPosition(uPos)
{
setBasicParameters<std::string>(stateName,cellDimensions,uPos);
}
Cell::Cell(sf::Vector2i & uPos, sf::Vector2f & cellDimensions, int stateNumber)
:unitPosition(uPos)
{
setBasicParameters<int>(stateNumber,cellDimensions,uPos);
}
.hpp ::
//Basic parameters which are being used by constructors
template < typename T = typename std::enable_if< std::is_base_of<int, T>::value, T>::type || typename std::enable_if< std::is_base_of<std::string, T>::value, T>::type>
void setBasicParameters(T& object, sf::Vector2f& cellDimensions, sf::Vector2i& uPos);
template<typename T>
inline void Cell::setBasicParameters(T& object, sf::Vector2f& cellDimensions, sf::Vector2i& uPos)
{
shape.setSize(cellDimensions);
shape.setOutlineThickness(cellDimensions.x/10.0f); //10%
shape.setOutlineColor(constants::cell::FILL_COLOR);
shape.setPosition(uPos.x*cellDimensions.x, uPos.y*cellDimensions.y);
if (!StateSystem::isStateExist(object))
{
Logger::Log(constants::error::stateSystem::STATE_DOES_NOT_EXIST, Logger::STREAM::BOTH, Logger::TYPE::ERROR);
state = StateSystem::getNumberOfState(constants::defaults::EMPTY);
}
else
{
if (std::is_base_of<std::string, T>::value)
state = StateSystem::getNumberOfState(object);
else state = object;
setColor(StateSystem::getColorOfState(state));
}
}
и проблема есть:
if (std::is_base_of<std::string, T>::value)
state = StateSystem::getNumberOfState(object);
else state = object;
В этом случае, я проверяю тип T, и если это std :: string, я использую метод из StateSystem, который меняет имя на число. В противном случае, если T является int, мне не нужно изменять его, поэтому я сразу назначаю T для состояния (state is int). Но мой компилятор проверяет параметры DWO и дает мне ошибки:
Severity Code Description Project File Line Suppression State
C2440 Ошибка «=»: не удается преобразовать из «станд :: строка» к «uint8_t»
Severity Code Description Project File Line Suppression State
Error C2664 'int8_t mv::StateSystem::getNumberOfState(std::string)': cannot convert argument 1 from 'int' to 'std::string'
Могу ли я восстановить его без сделать два разных метода?
Вопрос: что происходит с sttic_if, что если T является производным от строки. Я могу себе представить, что встречаются те же проблемы, что и с static_cast для базового класса (заканчивается с временным?) – Swift
@Swift: извините, но я не понимаю, что вы просите - можете ли вы показать пример минимального кода? Независимо от того, поведение 'static_if' должно быть эквивалентно' if constexpr', несмотря на менее заманчивый синтаксис. –
@VittorioRomeo, я пробовал с if constexpr, но он дал мне 1 новую ошибку. Я использую сообщество Visual Studio 2015 https://scr.hu/6LXMY6 – mvxxx