много ошибок в шаблонах буста с MSVC2010 - PullRequest
0 голосов
/ 23 марта 2012

Это фрагмент кода:

#include <boost/utility.hpp>
#include <boost/type_traits.hpp>
#include <boost/type_traits/is_base_of.hpp>
#include <boost/typeof/typeof.hpp>

enum ScriptVarType_t { SVT_BOOL, SVT_STRING, SVT_CUSTOM, SVT_CustomWeakRefToStatic };

struct ScriptVar_t {};
struct CustomVar {
    struct Ref {};
    struct WeakRef {};
};

template<typename T> struct GetType;

template<typename T> struct _GetTypeSimple {
    typedef T type;
    static type defaultValue() { return T(); }
    static const type& constRef(const type& v) { return v; }
};

template<> struct GetType<bool> : _GetTypeSimple<bool> { static const ScriptVarType_t value = SVT_BOOL; };
template<> struct GetType<std::string> : _GetTypeSimple<std::string> { static const ScriptVarType_t value = SVT_STRING; };
template<> struct GetType<CustomVar::Ref> {
    typedef CustomVar::Ref type;
    static const ScriptVarType_t value = SVT_CUSTOM;
    static type defaultValue() { return type(); }
    static const type& constRef(const type& v) { return v; }
};


template<typename T>
struct CustomVarWeakRefType {
    typedef CustomVar::WeakRef type;
    static const ScriptVarType_t value = SVT_CustomWeakRefToStatic;
    static CustomVar::Ref defaultValue() { return T().getRefCopy(); }
    static CustomVar::WeakRef constRef(const T& v) { return v.thisRef.obj; }
};

struct StringType : GetType<std::string> {};

template<typename T>
struct _SelectType {
    static CustomVarWeakRefType<T>* selectType(const CustomVar&) { return NULL; }

    static StringType* selectType(const char*) { return NULL; }
    static StringType* selectType(char[]) { return NULL; }

    typedef typename BOOST_TYPEOF(*selectType(*(T*)NULL)) type;
};

template<typename T> struct GetType : _SelectType<T>::type {};

template<typename T>
T _CastScriptVarConst(const ScriptVar_t& s, T*, typename boost::enable_if_c<(GetType<T>::value < SVT_CUSTOM), T>::type*) {
    return (T) s;
}

template<typename T>
T _CastScriptVarConst(const ScriptVar_t& s, T*, typename boost::enable_if_c<boost::is_base_of<CustomVar,T>::value, T>::type*) {
    return *s.as<T>();
}

Некоторые ошибки:

3>c:\users\albert zeyer\programmierung\openlierox\include\CScriptableVars.h(416): error C2059: Syntaxfehler: ')'
3>c:\users\albert zeyer\programmierung\openlierox\include\CScriptableVars.h(416): error C2143: Syntaxfehler: Es fehlt ',' vor ')'
3>c:\users\albert zeyer\programmierung\openlierox\include\CScriptableVars.h(416): error C2947: ">" wird erwartet, um template-argument-list abzubrechen. ">" wurde gefunden.
3>c:\users\albert zeyer\programmierung\openlierox\include\CScriptableVars.h(416): warning C4346: 'GetType<T>::value<T>::type': Abhängiger Name ist kein Typ
3>          Präfix mit 'typename' zum Angeben eines Typs
3>c:\users\albert zeyer\programmierung\openlierox\include\CScriptableVars.h(416): error C2059: Syntaxfehler: ')'
3>c:\users\albert zeyer\programmierung\openlierox\include\CScriptableVars.h(421): error C2059: Syntaxfehler: ','
3>c:\users\albert zeyer\programmierung\openlierox\include\CScriptableVars.h(421): warning C4346: 'boost::is_base_of<CustomVar,T>::value': Abhängiger Name ist kein Typ
3>          Präfix mit 'typename' zum Angeben eines Typs
3>c:\users\albert zeyer\programmierung\openlierox\include\CScriptableVars.h(421): error C2143: Syntaxfehler: Es fehlt ',' vor ')'
3>c:\users\albert zeyer\programmierung\openlierox\include\CScriptableVars.h(421): error C2143: Syntaxfehler: Es fehlt ';' vor '{'
3>c:\users\albert zeyer\programmierung\openlierox\include\CScriptableVars.h(423): error C2143: Syntaxfehler: Es fehlt ';' vor '}'

(Кстати, есть ли способ получить эти сообщения на английском языке? Я новичок вMSVC. Например, он говорит: «>», как ожидается, отменит список аргументов шаблона, но «>» был найден.)

Сообщения об ошибках в основном глупы или неправильны.

Это почему?Я даже не понимаю, в какой части MSVC борется.

Как я могу обойти это?

1 Ответ

0 голосов
/ 29 марта 2012

ок, нашел проблему.Сравнение less в enable_if_c<(GetType<T>::value < SVT_CUSTOM), T> сбивает с толку компилятор, потому что он действительно не может знать, что value является целым числом.

Я изменил его на GetType<T>::value <= SVT_CUSTOM-1, и все работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...