错误:类型的临时类型的非const引用的无效初始化

时间:2013-06-13 04:06:38

标签: c++ reference initialization const pass-by-reference

我以为我可以像这样创建和填充C ++地图:

 39 int main(){
 40 
 41   cout << "Approximate travelling salesman path finder." << endl;
 42   cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl << endl;
 43 
 44   map<City, OtherCities> database; 
 45   ReadInData(&database);
 46   ... 
 47 }

作为旁注,ReadInData函数只需要map<City, OtherCities>引用作为参数,其中City只是字符串的typedef(城市名称),{ {1}}是一个优先级队列,包含(字符串,整数)对,代表其他城市及其与第一个城市的距离。

无论如何,尝试编译这会导致以下错误:

OtherCities

我在这里做错了什么,并且(除了使用禁忌全局变量之外)还有另一种很好的方法可以将pr3.cpp: In function ‘int main()’: pr3.cpp:45: error: invalid initialization of non-const reference of type ‘std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::priority_queue<OtherCity, std::vector<OtherCity, std::allocator<OtherCity> >, std::greater<OtherCity> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::priority_queue<OtherCity, std::vector<OtherCity, std::allocator<OtherCity> >, std::greater<OtherCity> > > > >&’ from a temporary of type ‘std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::priority_queue<OtherCity, std::vector<OtherCity, std::allocator<OtherCity> >, std::greater<OtherCity> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::priority_queue<OtherCity, std::vector<OtherCity, std::allocator<OtherCity> >, std::greater<OtherCity> > > > >*’ 保留在main函数中并在其他地方填充/使用它吗?我不想只是按价值传递它的副本......

2 个答案:

答案 0 :(得分:4)

如果该函数采用引用,则应传递database,而不是&database后者是database地址,因此它是&#39; sa指针,而不是参考。

答案 1 :(得分:1)

就像你说的那样,ReadInData()是这样的:

ReadInData(map<City, OtherCities>& param)
//                               ^
//                            NOTICE THIS

引用需要param。因此,您应该这样做:

map<City, OtherCities> database; 
ReadInData(database);
//         ^
//      BYE-BYE &

而不是ReadInData(&database);,因为有了这个,你实际上是database的地址传递给ReadInData(),这不是ReadInData()所需要的