Typedef不是命名空间的成员

时间:2018-03-18 14:30:23

标签: c++ namespaces typedef

所以,我试图分发一些开源代码,在编译时我遇到了这些错误:

  

C2039' TransactionId':不是CryptoNote'

的成员      

C2061语法错误:标识符' TransactionId'

<button>Stop</button>相对缺乏经验,通常只限于C++领域,但是,我可以清楚地看到C#TransactionId声明的typedef像这样的不同文件:

namespace CryptoNote {

typedef size_t TransactionId;
typedef size_t TransferId;
//more code

抛出错误的一行是:

  void sendTransactionCompleted(CryptoNote::TransactionId _id, bool _error, const QString& _error_text);

对于我没有经验的人来说,看起来好像TransactionID绝对是Cryptonote的成员,不是吗?

任何想法会发生什么?

回购在这里:https://github.com/hughesjs/Incendium_GUI

必要的子模块在这里:https://github.com/hughesjs/Incendium_Crypt

2 个答案:

答案 0 :(得分:1)

这些typedef在MIN中定义。

Incendium_Crypt/include/IWalletLegacy.h

void sendTransactionCompleted(CryptoNote::TransactionId _id, bool _error, const QString& _error_text);` 中定义,其中包含Incendium_GUI/src/gui/SendFrame.h。但是,IWallet.h 依次包含IWallet.h。因此,IWalletLegacy.h不知道那些typedef。

答案 1 :(得分:0)

如果没有看到所有代码,很难说,但有些事情会浮现在脑海中:

  • 首先这是你得到的第一个错误。使用C ++编译错误往往会导致一堆次要错误。例如,下面的结果与您看到的类似,但由于未size_t未定义而无法编译:

    名称空间CryptoNote {

    typedef size_t TransactionId; typedef size_t TransferId;

    }

    int main(void) {     CryptoNote :: TransactionId id;     返回0; }

    $ g ++ -std = c ++ 11 namespace.cxx -o namespace namespace.cxx:4:9:错误:'size_t'没有命名类型  typedef size_t TransactionId;          ^ ~~~~~ namespace.cxx:5:9:错误:'size_t'没有命名类型  typedef size_t TransferId;          ^ ~~~~~ namespace.cxx:在函数'int main()'中: namespace.cxx:11:17:错误:'TransactionId'不是'CryptoNote'的成员      CryptoNote :: TransactionId id;                  ^ ~~~~~~~~~~~~

有关定义size_t的标头列表,请参见http://www.cplusplus.com/reference/cstring/size_t/

  • CryptoNote是否嵌套在另一个名称空间内?
  • 是否在声明了函数的命名空间中定义了另一个CryptoNote
  • 这些是否在同一个头文件中?如果没有,定义名称空间的头文件是否包含在包含函数声明的头文件中?