2014-02-18 18 views
2

我想變體包含其類型的對象的副本。不知怎的,它不工作:遞歸變體容器編譯器錯誤

struct value 
{ 
}; 

class json; 

using json = ::boost::variant< 
    ::std::vector<::std::unique_ptr<json> >, 
    ::std::unordered_map<::std::string, ::std::unique_ptr<json> >, 
    value 
>; 

json.hpp:116:2: error: conflicting declaration 'using json = ' 
>; 
^
json.hpp:110:7: error: 'class json' has a previous declaration as 'class json' 
class json; 

我知道2級的解決方法已經:::std::unique_ptr<void>,具有定製刪除,以及使用::boost::any,而不是變種的可能性,但這些的唯一途徑? ::boost::any的問題在於我需要啓用RTTI才能正常工作。

+2

嗯,問題是名稱衝突。你不把別名作爲'json_variant'還是別的? –

+1

你想要一個'recursive_variant'(...或者其他所謂的)。 Boost有一個特定的界面。對於它的價值,'class json;'意味着你將有一個名爲'json'的類,其中'using ='聲明的typedef-name不是。 – Potatoswatter

+1

@ user1095108不是一個非常值得回答的問題,但你應該閱讀http://www.boost.org/doc/libs/1_55_0/doc/html/variant/tutorial.html#variant.tutorial.recursive – Potatoswatter

回答

1

關於什麼:

struct json : ::boost::variant< 
    ::std::vector<::std::unique_ptr<json> >, 
    ::std::unordered_map<::std::string, ::std::unique_ptr<json> >, 
    value 
> 
{ 
    using variant::variant; 

    template <typename U> 
    json& operator=(U&& u) 
    { 
    variant::operator=(::std::forward<U>(u)); 

    return *this; 
    } 
}; 

這將是解決辦法,但它不適合我使用g ++工作(JSON構建了載體的,因爲模棱兩可的構造函數調用的失敗)。從構建一個const引用來這樣一個向量工作,但不是來自非const引用。我不知道爲什麼。另外,unique_ptr不適用於我的boost::variant,因爲它是不可複製的(shared_ptr確實有效)。

+0

您的解決方案的問題是,構造函數不繼承,也許與繼承構造函數... – user1095108

+0

糟糕,是的,需要繼承構造函數。定影。 –

+0

可能是標準本身的錯誤。如果'value_type'是不可複製的,它是否要求向量的拷貝構造函數被'SFINAE'd帶走?這是造成問題的原因(可以通過使用'shared_ptr'來解決)。 – user1095108