2017-06-17 86 views
-5

我無法理解這行從源代碼代碼在github上:這行代碼在C++中意味着什麼?

using NodePtr = std::shared_ptr<Node>; 

我讀了cppreference頁面here,但它沒有關於類似的語法的任何信息。盡我所能猜到,它有點像#define,因爲從現在開始我使用NodePtr時,它將在內部用std::shared_ptr<Node>代替它。有了這個,我試圖測試代碼,但它沒有奏效。

代碼:

test.h

#ifndef TEST_H_ 
#define TEST_H_ 

#include <memory> 
#include <string> 
#include <vector> 
#include <unordered_map> 
#include <utility> 
#include <typeinfo> 
#include <limits> 
#include <functional> 


namespace nnvm { 
class Node; 


using NodePtr = std::shared_ptr<Node>; 


class Node { 
public: 

    ~Node(); 

    inline bool is_variable() const; 
    inline int num_outputs() const; 
    inline int num_inputs() const; 

}; 

} 

#endif // TEST_H_ 

test.cpp

#include "test.h" 
#include <iostream> 


static graphy::NodePtr Create(); 

int main(int argc, char const *argv[]) 
{ 
    /* code */ 

    graphy::Node *node = new graphy::Node(); 
    std::cout << "Hello Graphy!!" << std::endl; 
    return 0; 
} 

以下是錯誤我得到:

In file included from /usr/include/c++/5/unordered_map:35:0, 
       from test.h:7, 
       from test.cpp:1: 
/usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options. 
#error This file requires compiler and library support \ 
^
In file included from test.cpp:1:0: 
test.h:18:7: error: expected nested-name-specifier before ‘NodePtr’ 
using NodePtr = std::shared_ptr<Node>; 
    ^
test.cpp:5:14: error: ‘NodePtr’ in namespace ‘graphy’ does not name a type 
static graphy::NodePtr Create(); 
      ^
+2

當然有。這是[底部的第三個鏈接](http://en.cppreference.com/w/cpp/language/type_alias)。 – Rakete1111

+4

這是一個別名。您可以在代碼中使用'NodePtr'而不是'std :: shared_ptr '。 – Azeem

+4

請閱讀第一條錯誤消息並按照說明進行操作。 – molbdnilo

回答

2

乍一看喲你的錯誤是由於命名空間。 using語句位於命名空間nnvm中,而不是Graphy。

'使用'與'typedef'類似。這是允許'nnvm :: NodePtr'表示'std :: shared_ptr'的別名。

更新 作爲@UnholySheep所指出的,你還需要增加一個編譯器設置,使C++ 11的支持,因爲編譯器錯誤狀態。

+2

*「#error此文件需要編譯器和庫支持ISO C++ 2011標準。」* - 這是第一個錯誤,它與命名空間無關 – UnholySheep

+0

@UnholySheep啊,是的。我停下來注意到第一個錯誤。但你是對的。這裏有更多的錯誤。 –

0

您看到的錯誤消息表明您正嘗試使用默認爲C++ 98模式的舊編譯器編譯C++ 11代碼。你可能需要一個命令行開關,像-std = C++ 11(或類似的東西,取決於你正在使用的編譯器)。或者得到一個新的編譯器。

相關問題