私のプロジェクトの1つに、総称タイプT
の値を含むツリーデータ構造があります。友人クラスを使用してコンパイル時間と依存性を減らす
コンパイル時間と依存性を減らすため、実装の詳細をツリーノードクラスNode
からクラスNodeImpl
に移動しようとしました。 Node
の内部はプライベートであり、定義されたエントリポイント、例えばgetName
機能によってのみアクセスされる必要があります。
getName
を使用することに興味のある人だけが、NodeImpl
をソースファイルに含める必要があります。これは私のコンパイル時間と依存性を減らすための方法です。
しかし、何らかの理由で、次の3つのおもちゃのクラスはコンパイルされません。私的なメンバーへのアクセスはないと言います。私は間違っているの?
ファイルmain.cpp
:
#include <iostream>
#include "Node.h"
#include "NodeImpl.h"
int main(int argc, char** args) {
Node<int> n("Test", 2);
std::cout << getName(n) << std::endl;
}
ファイルNode.h
:
#pragma once
#include <string>
template<typename T>
class NodeImpl;
template<typename T>
class Node {
public:
typedef T value_type;
Node(const std::string& name, const T& value) : name(name), value(value) {}
private:
std::string name;
T value;
friend class NodeImpl<T>;
};
ファイルNodeImpl.h
:
#pragma once
#include "Node.h"
template<typename T>
std::string getName(Node<T>& n);
template<typename T>
class NodeImpl {
NodeImpl(Node<T>& node) : mNode(node) {
}
Node<T>& mNode;
std::string name() {
return mNode.name;
}
friend std::string getName(Node<T>& n);
};
template<typename T>
std::string getName(Node<T>& n) {
auto x = NodeImpl<T>(n);
return x.name();
}
友人の友人はあなたの友人ではありません – Danh
助けてくれてありがとう。もちろん、友人宣言は推移的ではありません。私は 'NodeImpl.h'を変更しました。これが解決策だと思った。しかし、まだそれはコンパイルされていません。 :-( – Aleph0