[英]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
。
我嘗試了一些不同的更改:
m_Sources
從QSet
更改為QVector
,它會編譯並運行。m_Sources
從QSet
更改為std::set
,它會編譯並運行。QSet
的模板參數從typename GraphTypes::NodeType const *
更改為Node<DefaultGraphTypes> const *
,它會編譯並運行。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>
:
正如@NicolBolas 所建議的那樣,解決方案是在導入模塊之前在module.cpp
中#include <QSet>
:
// module.cpp
#include <QSet>
import Graph;
Node<DefaultGraphTypes> TestNode;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.