次の関数オブジェクトがあります。
/// function object wrapping node and label data into strings of DOT code
/// requires as template parameters 2 function objects that define behaviour
/// converting node and lable into strings. Requires as first template
/// argument the graph edge type
template<typename GRAPHEDGE, typename NodeToStringConverter,
typename LabelToStringConverter>
struct DOTWrapper
{
typedef NodeToStringConverter NodeConverter;
typedef LabelToStringConverter LabelConverter;
/// initialises to-string-converter objects
DOTWrapper(NodeConverter& nc, LabelConverter& lc): nts(nc), lts(lc){}
std::string start() const
{
return ("digraph {\n");
}
// wrap an egde into dot code
std::string wrap_edge(const GRAPHEDGE& e) const
{
// n needs to be to_string-able
return ("\t\""+nts(e.source())+"\""+" -> "+"\""+nts(e.target())+"\""+
" [ label = \""+lts(e.label())+"\" ];\n");
}
std::string finish() const { return "}\n"; }
const NodeToStringConverter nts;
const LabelToStringConverter lts;
};
template<typename Node>
struct NTSint
{
std::string operator()(const Node& node) const { return node; }
};
template<typename Label>
struct LTSstr
{
std::string operator()(const Label& label) const { return label; }
};
次のように Wrapper オブジェクトをインスタンス化しようとすると:
typedef NTSint<Edge::Node> NConv;
typedef LTSstr<Edge::Label> LConv;
typedef DOTWrapper<Edge, NConv, LConv> DOTf;
const DOTf dotf((NConv()), (LConv()));
私は得る
「エラー: 'const DOTf' (別名 'const DOTWrapper') の初期化に一致するコンストラクターがありません const DOTf dotf((NConv()), (LConv()));」
何故ですか?結局、NConv と LConv はメモリ内に場所があります...だから...それらは左辺値であるべきではありませんか?