2012-11-04 62 views
1

我有這樣的代碼:拷貝構造函數奇怪的編譯錯誤

namespace js0n 
{ 

struct json 
{ 
    typedef int json_object; 

    json(){} 

    json(json_object const& other) 
    { 
    } 

    json& operator=(json_object const& other) 
    { 
    return *this; 
    } 
}; 

typedef json::json_object json_object; 

} 

js0n::json json(js0n::json_object());給出編譯錯誤。

int main() 
{ 
    js0n::json json(js0n::json_object()); 

    return 0; 
} 

請注意,我剔除了大部分代碼,因爲它不會對錯誤負責。我究竟做錯了什麼?

錯誤消息:

test.cpp: In function 'int main()': 
test.cpp:9:8: error: request for member 'parse' in 'json', which is of non-class type  'js0n::json(js0n::json_object (*)()) {aka js0n::json(int (*)())}' 

賦值運算符,即(json = json_object();)的工作得很好。

+1

Way.Too.Much.Code。請刪除*任何*不必要的,幷包括你得到的錯誤。 – Xeo

+0

你可以忽略很多。問題在於複製構造函數。 – user1095108

回答

3

js0n::json json(js0n::json_object());

歡迎most vexing parse。這聲明瞭一個返回js0n::json並採取js0n::json_object參數的函數。爲了消除歧義,要麼在回答這個問題,增加更多的括號,如建議,或者(因爲你本來標記該[c++11]),使用列表初始化:

js0n::json json{js0n::json_object()}; 

或者

js0n::json json(js0n::json_object{}); 

或者

js0n::json json{js0n::json_object{}}; 

:)

+0

是的,我標記了'C++ 11',因爲'std :: unordered_map'。謝謝! – user1095108

+0

@user:總是用'[C++]'標記標籤,並且如果它是關於C + 11的特定內容,請添加'[C++ 11]'。但是,你的代碼可能已經被削減到根本不包含任何內容,並且實際上是一個5-10行的示例。 – Xeo

+0

完成後,還要注意默認構造函數''默認',另一個C++ 11功能。 – user1095108

3

你還沒有說的編譯錯誤是什麼,但它看起來就像你絆倒most vexing parse

js0n::json json(js0n::json_object()); 

該聲明的函數。要聲明一個局部變量,你需要更多的括號:

js0n::json json((js0n::json_object())); 
       ^    ^
+0

的確最令人煩惱!謝謝! – user1095108