簡體   English   中英

在C++模塊中使用QSet和CRTP

[英]Using QSet and CRTP in C++ module

我正在嘗試將我的一些 C++ 代碼庫從使用 header 文件轉換為使用模塊。

這是編譯和工作的.h / .cpp對:

// Graph.h
#pragma once
#include <QSet>

template<class NodeT>
struct GraphTypes {
   using NodeType = NodeT;
};

template<class GraphTypes> class Node;
class DefaultGraphTypes : public GraphTypes<Node<DefaultGraphTypes>> {};

template<class GraphTypes>
class Node {
   QSet<typename GraphTypes::NodeType const *> m_Sources;
};
// header.cpp
#include "Graph.h"

Node<DefaultGraphTypes> TestNode;

我已將其轉換為以下.ixx / .cpp對:

// Graph.ixx
module;
#include <QSet>

export module Graph;

template<class NodeT>
struct GraphTypes {
   using NodeType = NodeT;
};

template<class GraphTypes> class Node;
export class DefaultGraphTypes : public GraphTypes<Node<DefaultGraphTypes>> {};

export template<class GraphTypes>
class Node {
   QSet<typename GraphTypes::NodeType const *> m_Sources;
};
// module.cpp
import Graph;

Node<DefaultGraphTypes> TestNode;

編譯后者時,出現錯誤C2877'QHash<Key,T>::Node' is not accessible from 'QHash<Key,T>' in file qhash.h , line 1080

我嘗試了一些不同的更改:

  1. 如果我將m_SourcesQSet更改為QVector ,它會編譯並運行。
  2. 如果我將m_SourcesQSet更改為std::set ,它會編譯並運行。
  3. 如果我將QSet的模板參數從typename GraphTypes::NodeType const *更改為Node<DefaultGraphTypes> const * ,它會編譯並運行。
  4. 如果我將QSet的模板參數從typename GraphTypes::NodeType const *更改為typename DefaultGraphTypes::NodeType const * ,它會編譯並運行。

出了什么問題? 我正在使用 Qt 5.15.10 和 Visual Studio 17.4.2。

qhash.h 1080行在 class QMultiHash<Key, T>中,它繼承自QHash<Key, T> 在此處輸入圖像描述

QHash<Key, T>::Node看起來像這樣: 在此處輸入圖像描述

正如@NicolBolas 所建議的那樣,解決方案是在導入模塊之前在module.cpp#include <QSet>

// module.cpp
#include <QSet>
import Graph;

Node<DefaultGraphTypes> TestNode;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM