6

我有一个数据类型,我可以实例化该类型的变量。像这样:

FetchAddr faddr(VirtualMemoryAddress( 0x0a ));

FetchAdr 的定义是:

struct FetchAddr {
   VirtualMemoryAddress theAddress;
   FetchAddr(VirtualMemoryAddress anAddress)
     : theAddress(anAddress)
   { } 
};

现在我有一个 faddr 是私有(或公共)变量的类

class FLEXUS_COMPONENT(BPred)  {
   static FetchAddr faddr;
   public:
     FLEXUS_COMPONENT_CONSTRUCTOR(BPred)
        : base( FLEXUS_PASS_CONSTRUCTOR_ARGS )
     {
        faddr = VirtualMemoryAddress( 0x0a );
     }
   ...
}

假设宏定义正确。

代码编译和链接没有任何问题。但是,当我启动程序时,它会说:

 "undefined symbol: _ZN6nBPred14BPredComponent8faddr"

它说没有faddr的符号。

有什么想法吗?

4

3 回答 3

4

当您声明一个静态成员时,您还必须在某处定义它,例如在 .cpp 文件中。并且还记得链接到这个文件。


问题 2 -FetchAddr没有默认构造函数。

如果你需要faddr作为类的静态成员,你还需要在定义的时候给它一个值,比如:

FetchAddr FLEXUS_COMPONENT(BPred)::faddr(VirtualMemoryAddress( 0x0a ));

这将创建一个faddr由所有FLEXUS_COMPONENT(BPred)对象共享的。

如果您希望每个对象都有自己的faddr变量副本,则可以将其设为非静态并在构造函数中对其进行初始化:

class FLEXUS_COMPONENT(BPred)  {
   FetchAddr faddr;
   public:
     FLEXUS_COMPONENT_CONSTRUCTOR(BPred)
        : base( FLEXUS_PASS_CONSTRUCTOR_ARGS ),
          faddr(VirtualMemoryAddress( 0x0a ))
     { }
   // ...
};
于 2011-07-31T12:41:03.863 回答
3

您必须在别处定义静态变量。

FetchAddr FLEXUS_COMPONENT(BPred) :: faddr;

在单个 TU 中。

于 2011-07-31T12:39:22.787 回答
2

尝试使用 进行编译,-Wl,--no-undefined以便即使有一个未在库或任何其他依赖项中定义的符号,链接器也将拒绝完成链接。

faddr没有正确链接,并且没有看到更多您的程序,很难知道还有什么事情发生。

于 2011-07-31T12:55:00.937 回答