Я делаю игру для Mac и Windows с Cocos2d-x.
Сначала я написал код в Xcode, который можно запустить на Mac.
Я получил ошибку, когдаЯ взял его в Windows и попытался собрать в Visual Studio 2017.
NRZNotification.h
#include "cocos2d.h"
class NRZNotification : public cocos2d::Ref
{
protected:
std::string _name;
cocos2d::Ref* _sender;
...
cocos2d::ValueMap _valueMap;
cocos2d::Map<std::string, cocos2d::Ref*> _objectMap;
public:
const std::string& getName(){return _name;}
cocos2d::Ref* getSender(){return _sender;}
NRZNotification();
virtual ~NRZNotification();
static NRZNotification* create(const std::string& name, Ref* sender);
bool init(const std::string& name, Ref* sender);
...
template <typename T,
typename std::enable_if<!std::is_convertible<T, cocos2d::Ref*>::value,
std::nullptr_t>::type = nullptr>
inline T getValue(const std::string& key)
{
//CCLOG("%s", __PRETTY_FUNCTION__);
return 0;
}
template <typename T,
typename std::enable_if<std::is_convertible<T, cocos2d::Ref*>::value,
std::nullptr_t>::type = nullptr>
inline T getValue(const std::string& key)
{
//CCLOG("%s", __PRETTY_FUNCTION__);
return dynamic_cast<T>(_objectMap.at(key));
}
};
#include "NRZNotification_Private.h"
NRZNotification_Private.h
#include "NRZNotification.h"
...
#pragma mark - get value
template <>
inline int NRZNotification::getValue<int,nullptr>(const std::string& key)
{
if (_valueMap.find(key) == _valueMap.end()) {
return 0;
} else {
return _valueMap.at(key).asInt();
}
}
template <>
inline float NRZNotification::getValue(const std::string& key)
{
if (_valueMap.find(key) == _valueMap.end()) {
return 0.0f;
} else {
return _valueMap.at(key).asFloat();
}
}
template <>
inline double NRZNotification::getValue(const std::string& key)
{
if (_valueMap.find(key) == _valueMap.end()) {
return 0.0;
} else {
return _valueMap.at(key).asDouble();
}
}
...
Эти коды успешно выполнялись на Mac, но в Visual Studio 2017 вызов getValue () дал ошибку «не может быть явно специализированным».
getValue () - это шаблон функции, и реализация делится в зависимости от того, является ли возвращаемое значение подклассомcocos2d :: Ref.
Кроме того, специализация делается для int, float, string и т. д.
Как мне исправить этот код?
Я использую cocos2d-x3.17.1.
Спасибо.