use*_*235 7 c++ qt templates visual-studio-2010 mingw32
我正在使用C++中的模板.使用MSVC编译器和使用Mingw gcc编译器时,使用模板和友元类是否有任何区别.我的代码在使用MSVC编译时成功编译并提供所需的输出,但在使用gcc编译时会出错.以下是我的代码,
///////////Record.h/////////////////////
#include "Base.h"
class Derived1;
class Derived2;
template <class TYPE_LIST> class List;
class FRecord
{
public:
FRecord();
virtual ~FRecord();
friend class Base;
#if _MSC_VER <= 1200
friend class List<Derived1>;
friend class List<Derived2>;
#else
template <class TYPE_LIST> friend class List;
#endif
};
///////////////////////////////////////////////////////////////
///////////////////Base.h/////////////////////////////////
class Base
{
public:
Base(const HEADER *hc, const FRecord *fr);
virtual ~Base();
__inline bool IsNonValid() const;
protected:
quint32 Size;
};
/////////////////////////////////////
// Data
/////////////////////////////////////
template <class TYPE_LIST>
class Data : public TYPE_LIST
{
public:
Data(const HEADER *hc, const FRecord *fr) : TYPE_LIST(hc, fr)
{
QString val = IsNonValid() ? "Non" : "";
LOG0("Data ("<< val << " Valid)");
}
virtual ~Data()
{
LOG0("Data deleted");
}
}; // Data
///////////////////////////////////////////////////////////////////////////////////////
Run Code Online (Sandbox Code Playgroud)
编译时,上面的代码与MSVC给出了所需的输出,但是当用Mingw GCC编译器编译时,它给出了以下错误,
Base.h:1154: error: there are no arguments to 'IsNonValid' that depend on a template parameter, so a declaration of 'IsNonValid' must be available
Base.h:1553: error: 'Size' was not declared in this scope
Run Code Online (Sandbox Code Playgroud)
什么可能解决这个问题?提前致谢.
Rei*_*ica 10
MSVC未正确实现两阶段名称查找.GCC报告此错误是正确的.
原因是模板内部使用的名称不依赖于模板的参数(在VC的情况下)在定义模板时查找,而不是在实例化时查找.
在你的情况下,编译器无法告诉IsNonValid它将来自基类,所以它理所当然地抱怨它不知道它.有两种可能的解决方案:
限定访问权限IsNonValid,以便编译器清楚它(可能)取决于模板参数:
QString val = this->IsNonValid() ? "Non" : "";
// or
QString val = TYPE_LIST::IsNonValid() ? "Non" : "";
Run Code Online (Sandbox Code Playgroud)将继承的名称引入派生类的范围:
template <class TYPE_LIST>
class Data : public TYPE_LIST
{
public:
using TYPE_LIST::IsNonValid;
// the rest as you had it originally
Run Code Online (Sandbox Code Playgroud)这些中的任何一个都会使名称依赖,从而将其查找推迟到实体化时,TYPE_LIST实际知道其值.
gcc是对的.您需要添加this->延迟查找直到实例化时间.
this->IsNonValid();
MSVC是不符合的,因为它延迟所有查找直到实例化时间,因为它没有正确实现两阶段名称查找.
| 归档时间: |
|
| 查看次数: |
235 次 |
| 最近记录: |