gpt4 book ai didi

c++ - GCC vs VC++ 模板语法错误(为什么不能在两者上编译?)

转载 作者:太空宇宙 更新时间:2023-11-04 14:12:40 26 4
gpt4 key购买 nike

我购买了一个 Ogre 插件(粒子宇宙)的源代码,它是(或者应该是)用平台无关的 C++ 编写的。它带有一个编译得很好的 Visual Studio 解决方案,但是因为我的整个项目都是用 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;
}

最佳答案

这段代码完全是胡说八道:

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

它看起来像一个模板函数定义:

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

部分。但是还有一个冒号,它只在构造函数初始化列表中是合法的,后面是 public,它只在类声明中是合法的。 :public: 这两个标记不能像这样一起出现。

这里一定有一些宏黑魔法在 MSVC 下编译,但在 GCC 下不起作用。如果是这样,这就是为什么宏是邪恶的一个主要例子。当被滥用时,它们会产生一种新的 secret 语言,除了作者之外没有人知道。

除非您可以获得库作者的直接支持,否则您可能很难在 GCC 下进行编译。

关于c++ - GCC vs VC++ 模板语法错误(为什么不能在两者上编译?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13401371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com