2012-11-04 64 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