gpt4 book ai didi

C++ 模板化函数和前向声明

转载 作者:行者123 更新时间:2023-11-30 02:11:20 24 4
gpt4 key购买 nike

我正在编写一些使用 MSVC 在 Windows 上编译和链接(甚至发布商业产品)的代码。虽然它不能用 GCC 编译,但我收到以下错误:

.../CBaseValue.h: In member function 'bool CBaseValue::InstanceOf()':
.../CBaseValue.h:90:18: error: invalid use of incomplete type 'struct CValueType'
.../CBaseValue.h:11:7: error: forward declaration of 'struct CValueType'

CBaseValue.h

class CValueType;

class CBaseValue {
public:

...

template <typename _Type>
bool InstanceOf() {
CValueType* pType = GetType();
if(pType == NULL) {
return false;
}
else {
return pType->IsDerivedFrom<_Type>();
}
}

...

}

CValueType.h

class CValueType : public CBaseValue  {
public:

...

template <typename _Type>
bool IsDerivedFrom() {
return IsDerivedFrom(_Type::TYPEDATA);
}

...

}

我明白为什么这是个问题。基类 (CBaseValue) 具有使用派生类(在本例中为 CValueType)的模板化函数。

看起来 MSVC 并没有完全遵守这里的 C++ 规范,我刚刚被它咬伤了。但是,在实际编译调用模板函数的代码之前使用前向声明的 MSVC 行为现在也更可取。有没有人知道我可以让这段代码与 GCC 一起工作而无需重写大量基本代码的解决方法?

根据我自己的研究,似乎将“-fno-implicit-templates”传递给 g++ 会有所帮助,但我需要明确定义调用的模板类型。它们有很多,所以如果我能避免的话,我会更喜欢它。如果普遍认为这是我的最佳选择……那就这样吧!

如果有人想知道,我正在将代码移植到 Mac,这就是我们现在使用 GCC 的原因。

最佳答案

这是标准格式错误的,但不需要诊断。 MSVC 可以很好地诊断这个 特殊情况(即使发生实例化!)。

更具体地说,(C++03) 标准规则在 14.6/7

If a type used in a non-dependent name is incomplete at the point at which a template is defined but is complete at the point at which an instantiation is done, and if the completeness of that type affects whether or not the program is well-formed or affects the semantics of the program, the program is ill-formed; no diagnostic is required.

所以解决方案是让类型依赖,但安排在实例化期间指定该类型。例如,您可以像这样重写您的模板来做到这一点

template<typename T, typename> // just ignore second param!
struct make_dependent { typedef T type; };

template <typename Type> // eww, don't use "_Type" in user code
bool InstanceOf() {
typename make_dependent<CValueType, Type>::type* pType = GetType();
// ...
return pType->template IsDerivedFrom<Type>();
// ...
}

关于C++ 模板化函数和前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3631621/

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