2017-09-20 6 views
-5

ASTUtils.cppにCreateEmptyFuncDefと指定された場合、シンボルdev::solidity::CreateEmptyFuncDefが見つかりませんでしたので、リンクしないコードをデバッグしました(戻り値の型とパラメータは省略されています)。クラスメソッドがヘッダーファイルのスタンドアロンメソッドを名前空間で修飾する必要があるのはなぜですか?

しかし、定義されたLocationFinderクラスのメソッドがない場合、はdev::solidityによって修飾される必要がありますか?

私はusing dev::solidityで十分であると思っていたので、名前空間修飾子を省略することができますか?

ASTUtils.h:

#pragma once 

#include <libevmasm/SourceLocation.h> 
#include <libsolidity/ast/ASTVisitor.h> 
#include <string> 

namespace dev 
{ 
namespace solidity 
{ 

class LocationFinder: private ASTConstVisitor 
{ 
public: 
    LocationFinder(SourceLocation const& _location, std::vector<ASTNode const*> _rootNodes): 
     m_rootNodes(_rootNodes), m_location(_location) 
    { 
    } 

    /// @returns the "closest" (in the sense of most-leafward) AST node which is a descendant of 
    /// _node and whose source location contains _location. 
    ASTNode const* leastUpperBound(); 

private: 
    bool visitNode(ASTNode const& _node); 

    std::vector<ASTNode const*> m_rootNodes; 
    SourceLocation m_location; 
    ASTNode const* m_bestMatch = nullptr; 
}; 

ASTPointer<FunctionDefinition> CreateEmptyFuncDef(const std::string name, const std::string sourcePath); 

} 
} 

ASTUtils.cpp:

#include <libsolidity/ast/ASTUtils.h> 

using namespace std; 
using namespace dev; 
using namespace dev::solidity; 



ASTNode const* LocationFinder::leastUpperBound() 
{ 
    m_bestMatch = nullptr; 
    for (ASTNode const* rootNode: m_rootNodes) 
     rootNode->accept(*this); 

    return m_bestMatch; 
} 

bool LocationFinder::visitNode(const ASTNode& _node) 
{ 
    if (_node.location().contains(m_location)) 
    { 
     m_bestMatch = &_node; 
     return true; 
    } 
    return false; 
} 

ASTPointer<FunctionDefinition> dev::solidity::CreateEmptyFuncDef(const string name, const string sourcePath) { 
    SourceLocation _loc(0, 0, make_shared<ASTString>(sourcePath)); 
    ASTPointer<ASTString> _name = make_shared<ASTString>(name); 
    Declaration::Visibility _visibility = Declaration::Visibility::Public; 
    StateMutability _mutability = StateMutability::NonPayable; 
    bool _isConstructor = false; 
    ASTPointer<ASTString> _doc = make_shared<ASTString>(); 
    std::vector<ASTPointer<VariableDeclaration>> _varDecs; 
    ASTPointer<ParameterList> _params = make_shared<ParameterList>(_loc, _varDecs); 
    std::vector<ASTPointer<ModifierInvocation>> _mods; 
    ASTPointer<ParameterList> _retParams = make_shared<ParameterList>(_loc, _varDecs); 
    std::vector<ASTPointer<Statement>> _statements; 
    ASTPointer<Block> _body = make_shared<Block>(_loc, _doc, _statements); // empty block 
    return make_shared<FunctionDefinition>(_loc, _name, _visibility, _mutability, _isConstructor, _doc, _params, _mods, _retParams, _body); 
} 
+4

あなたが提供したコードの大部分は、あなたの質問とは完全に無関係です。最低限の*** [mcve]を生産するのに必要な少量の労力をかけてみませんか? –

答えて

2

using namespaceディレクティブは、現在のネームスペースへの既存の名前が使用可能になりますが、それは、新しい名前を定義するために、あなたを禁止していませんつまり、既存の名前と競合しない名前です。あなたはグローバル名前空間でこのような何かするとき:

ASTPointer<FunctionDefinition> CreateEmptyFuncDef(const string name, const string sourcePath) { 
    // 
} 

をそれは宣言し、以前dev::solidity::CreateEmptyFuncDef宣言は異なる新たな機能CreateEmptyFuncDefを定義します。

namespace dev { 
namespace solidity { 

ASTPointer<FunctionDefinition> CreateEmptyFuncDef(const string name, const string sourcePath) { 
    // 
} 

} 
} 

新しい名前を導入せずにdev::solidity::CreateEmptyFuncDefを定義します:あなたはこのようなdev::solidity名前空間内で、この関数を囲むことができdev::solidity::資格を回避するために

クラス名も名前空間で修飾されている必要があります。それはエラーでコンパイルに失敗したGCCで

namespace foo { 

class Bar { 
void baz(); 
}; 

} 

void Bar::baz() {} 

int main() { 
} 

:たとえば、次の最小限のコードを検討し

test.cpp:9:6: error: ‘Bar’ has not been declared 
void Bar::baz() {} 
    ^

あなたの必要性のいずれかでコンパイルするには:

void foo::Bar::baz() {} 

または名前空間内で囲みをあまりにも。

+0

ありがとうございますが、なぜクラスメソッドには必要ではありませんか? – Shuzheng

+0

あなたのクラスも名前空間で修飾されている必要があります。これはあなたが使用している正確なコードであると確信していますか? – taskinoor

+0

はい、私はクラスを自分で作っていません。私はちょうどASTUtils.cpp/hにメソッドを追加しています - それはEthereumのSolidityプロジェクトです。 – Shuzheng

関連する問題