2013-08-28 38 views
1

我提到了这个链接有关打印地图的内容:如何打印地图内容与数据类型是一个类的对象

print map content

,所以我知道的印刷地图内容的基础上,但我不知道如果我定义我的与数据类型如下方式映射是一个类对象,并与其它的代码,如下所示:

typedef map <string, fsdbSig *> Pinname_sig; 
Pinname_sig _Pinname_sig; 
Pinname_sig :: iterator itPS; 

我想知道打印的地图内容的方式是与上述相同的链接?

for (itPS = _Pinname_sig.begin(); itPS != _Pinname_sig.end(); ++itPS){ 
    cout << "Jden-key:" << itPS->first << "," << "value:" << itPS->second <<endl; 
} 

如果是,那么当使用重载操作< <,因为我看到使用该方法的一些职位。

嗨@computer

struct fsdbSig 
{ 
    public: 
     friend std::ostream& operator<< (std::ostream& , const fsdbSig&); //jaden 
     char * _name;  // signal name 
     fsdbVarType _type; // signal type 
     ushort_T _lbitnum; // signal left bit number 
     ushort_T _rbitnum; // signal right bit number 
     fsdbBytesPerBit _bpb; // signal byte per bit 
     byte_T _value;  // signal value 

     fsdbSig(char * name, fsdbVarType type, ushort_T lbitnum, ushort_T rbitnum, fsdbBytesPerBit bpb, byte_T value) // constructor 
     { 
      _name = name; 
      _type = type; 
      _lbitnum = lbitnum ; 
      _rbitnum = rbitnum ; 
      _bpb = bpb; 
      _value = value ; 
     } 

}; 

但发生错误未定义的参考`运营商< <(STD :: basic_ostream

+0

我很困惑这个问题是关于如何发送一个指针到对象到一个'std :: ostream'或者如何为你的映射元素类型写一个插入操作符。你能否澄清这个问题(或者它的* *或*都不是那些?)。 – WhozCraig

+0

@WhozCraig嗨,其实这两个问题我都希望知道答案。 :) –

回答

0

基本上把它打印出来,你会做什么:

typedef map <string, fsdbSig *> Pinname_sig; 
Pinname_sig _Pinname_sig; 
Pinname_sig::iterator itPS; 

for (itPS = _Pinname_sig.begin(); itPS != _Pinname_sig.end(); ++itPS){ 
    cout << "Jden-key:"<< itPS->first<< ","<< "value:"<< *(itPS->second) <<endl; 
                 ^since itPS->second 
                 is pointer to fsdbSig 
} 

然而,这只有在fsdbSig是一个定义为operator<<的类型时才有效,在全局命名空间中是这样的:

std::ostream& operator<< (std::ostream&, const fsdbSig&); 

或这fsdbSig类:

class fsdbSig { 
      public: 
      friend std::ostream& operator<< (std::ostream& , const fsdbSig&); 
    }; 

如果运营商需要访问fsdbSig对象的私人数据。并注意:如果您的类fsdbSig很复杂,您需要知道打印它的意义。

在您编辑后:

Hi,after i copied to the class now got this error: undefined reference to `operator<<(std::basic_ostream >&, fsdbSig const&)'

对不起,我以为你会知道你也必须添加operator<<不仅声明的定义,看来你真的是初学者。你有未定义的参考,因为函数被调用,这是没有定义。这是链接错误。那么现在该怎么做?提供operator<<的定义。然而,这可以有很多含义是打印您的类的对象是什么:“碧BIP”

  • 也许这意味着打印的名字
  • 也许就意味着打印的名字和做
  • 也许打印名称和值

这就是为什么我说你需要知道它是什么,比如你可以将它定义为

std::ostream& operator<< (std::ostream& os, const fsdbSig& f){ 
    os<<"My name is: "<<f.name; 
    return os; 
} 

,它不必是因为所有的C++结构都是公开的,所以每个人都可以访问它。所以这定义可以被放在结构外,你应该从里面的结构中删除它的声明


额外注: 我的建议是先一直使用谷歌搜索引擎,询问这里之前。你总是会找到快速回答这些基本的问题,如

error: undefined reference

,总是选择链接到第一堆栈溢出的职位如果没有列出任何人。

+0

我尝试使用*(itPS-> second)并且发生此错误 错误:'std :: operator –

+0

'中的'operator <<'没有匹配吗?是否为类fsdbSig定义了operator <<? plaese看到我的答案,你需要定义这个操作符。如果您不知道如何定义此运算符 – 4pie0

+0

@ milk4508,请另外插入类fsdbSig的代码,并注意:如果您的类fsdbSig非常复杂,您需要知道打印它的含义 – 4pie0

相关问题