1

プラットフォームに依存しないC++で記述された(または記述されているはずの)Ogreプラグイン(Particle Universe)のソースコードを購入しました。正常にコンパイルされるVisualStudioソリューションが付属していますが、プロジェクト全体がG ++でコンパイルされているため、そのライブラリもG++でコンパイルしたいと思います。しかし、何らかの理由で、テンプレート宣言はG++でエラーをスローします。これがコードスニペットです。

typedef Ogre::Any Any;
template <typename ValueType> ValueType* any_cast(Any* operand) : public any_cast(operand){};

このエラーが表示される理由をC++の第一人者が教えてくれますか?(おそらく異なる構文?)

include/ParticleUniverseAny.h: In function 'ValueType*
ParticleUniverse::any_cast(ParticleUniverse::Any*)':
include/ParticleUniverseAny.h:21:68: error: only constructors take member initializers
include/ParticleUniverseAny.h:21:68: error: expected identifier before 'public'
include/ParticleUniverseAny.h:21:68: error: expected '{' before 'public'
include/ParticleUniverseAny.h: At global scope:
include/ParticleUniverseAny.h:21:68: error: expected unqualified-id before 'public'

助けていただければ幸いです。

編集:any_castはOgreAny.hで定義されています

friend ValueType * any_cast(Any *);

template<typename ValueType>
ValueType * any_cast(Any * operand)
{
    return operand && operand->getType() == typeid(ValueType)
                ? &static_cast<Any::holder<ValueType> *>(operand->mContent)->held
                : 0;
}

template<typename ValueType>
ValueType * any_cast(Any * operand)
{
    return operand && operand->getType() == typeid(ValueType)
                ? &static_cast<Any::holder<ValueType> *>(operand->mContent)->held
                : 0;
}

template<typename ValueType>
const ValueType * any_cast(const Any * operand)
{
    return any_cast<ValueType>(const_cast<Any *>(operand));
}

template<typename ValueType>
ValueType any_cast(const Any & operand)
{
    const ValueType * result = any_cast<ValueType>(&operand);
    if(!result)
    {
        StringUtil::StrStreamType str;
        str << "Bad cast from type '" << operand.getType().name() << "' "
            << "to '" << typeid(ValueType).name() << "'";
        OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
            str.str(), 
            "Ogre::any_cast");
    }
    return *result;
}
4

1 に答える 1

0

このコードは完全にナンセンスです:

template <typename ValueType> ValueType* any_cast(Any* operand) : public any_cast(operand){};

これは、次のテンプレート関数定義のように見えます。

template <typename ValueType> ValueType* any_cast(Any* operand)

部。ただし、コンストラクタ初期化リストでのみ正当なコロンがあり、その後にpublicクラス宣言でのみ正当なコロンが続きます。2つのトークンは:public:このように一緒に存在することはできません。

ここでは、MSVCでコンパイルされ、GCCでは機能しないマクロブラックマジックが発生している必要があります。もしそうなら、これはマクロが悪になり得る理由の典型的な例です。誤用されると、作者以外の誰も知らない新しい秘密の言語になります。

ライブラリの作成者から直接サポートを得ることができない限り、これをGCCでコンパイルすることに関しては、おそらく気が狂います。

于 2012-11-15T16:07:14.273 に答える