GCC (MingW-w64) 找不到基础构造函数 (!?)

Posted

技术标签:

【中文标题】GCC (MingW-w64) 找不到基础构造函数 (!?)【英文标题】:GCC (MingW-w64) cannot find base constructor (!?) 【发布时间】:2015-01-13 19:25:44 【问题描述】:

我正在编写一些 hashmap 实现,但偶然发现了一个非常特殊的问题。 所以我写了一个抽象类如下:

// HashMap.hpp
template<typename K, typename V, typename HashFunc = std::hash<K>>
class HashMap

public:
    HashMap(unsigned int bucketLength = DEFAULT_BUCKET_LENGTH)
        : m_bucketsLength(bucketLength)
        , m_bucketsFilled(0)
    
        m_keyValueVector.resize(m_bucketsLength, nullptr);
    
    virtual ~HashMap()
    

    
...
;

并从中派生出一个实现:

// DoubleHashMap.hpp
#include "HashMap.hpp"

template<typename K, typename V, typename HashFunc = std::hash<K>>
class DoubleHashMap : public HashMap<K, V>

public:
    DoubleHashMap(unsigned int bucketLength = DEFAULT_BUCKET_LENGTH)
        : HashMap(bucketLength) // This is the line at which the build fails
    

    
...
;

使用 Visual Studio 2013 一切都像魅力一样,但是当尝试使用 MingW-w64 4.9.1 构建它时,我收到以下错误:

DoubleHashMap.h:11:错误:类“DoubleHashMap”确实 没有任何名为“HashMap”的字段 : HashMap(bucketLength) ^

换句话说,就好像编译器找不到基本构造函数一样。 我做错了什么还是这是 MingW-w64 中的错误?

编辑:尝试了 MingW 编译器的不同组合(MingW 4.8.3、TDM-GCC 4.8.1),它们都产生相同的错误。

【问题讨论】:

【参考方案1】:

您必须完全指定基类的名称:

DoubleHashMap(unsigned int bucketLength = DEFAULT_BUCKET_LENGTH)
    : HashMap<K, V>(bucketLength)

  ...

顺便说一句,您是否有可能从HashMap&lt;K, V, HashFunc&gt; 派生而不仅仅是HashMap&lt;K, V&gt;

【讨论】:

就是这样。有趣的是 MSVC 是如何编译代码的。 “顺便说一句,您是否有可能从 HashMap 而不仅仅是 HashMap 派生?是的,我只是假设我不需要,因为它有一个默认值。唉,看来我倾向于假设太多:) 谢谢!

以上是关于GCC (MingW-w64) 找不到基础构造函数 (!?)的主要内容,如果未能解决你的问题,请参考以下文章

传递指向成员函数的指针在 MinGW-w64 中编译,但不在 gcc 中

getline 函数未使用 mingw-w64 gcc 编译

MinGW-w64 编译失败,出现 nullptr_t

ubuntu32bit的系统如何配置mingw-w64的交叉编译toolchain?

在 GCC 10.3.0 中找不到 _mm256_rem_epu64 内在函数

我在哪里可以找到 `mingw64/mingw-w64-x86_64-gcc-libs` 8.2.0-3 的源代码包?