【问题标题】:error: invalid initialization of non-const reference of type...from a temporary of type [duplicate]错误:类型的非常量引用的无效初始化...来自临时类型[重复]
【发布时间】:2013-06-13 04:06:37
【问题描述】:

我想我可以像这样创建和填充 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&lt;City, OtherCities&gt; 引用作为参数,其中City 只是字符串的类型定义(城市名称),OtherCities 是优先级队列包含 (string, int) 对,表示其他城市及其与第一个城市的距离。

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

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> > > > >*’

我在这里做错了什么,并且(除了使用禁忌全局变量之外),还有另一种好方法可以将 database 保留在主函数中并在其他地方填充/使用它吗?我不想只是按值传递它的副本......

【问题讨论】:

  • database 不是一个未初始化的变量。假设map 指的是std::map,它有一个默认构造函数,database默认构造的
  • @K-ballo:已编辑。感谢您指出了这一点! :-)

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


【解决方案1】:

如果函数需要一个引用,你应该传递database,而不是&amp;database,后者是database地址,所以它是一个指针,而不是一个引用。

【讨论】:

  • 哦...哎呀。你会在大约 8 分钟内得到最佳答案复选标记,我可以给它...哈哈。
【解决方案2】:

如你所说,ReadInData() 是这样的:

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

参考需要param。因此,您应该这样做:

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

而不是ReadInData(&amp;database);,因为这样,您实际上database 的地址传递给ReadInData(),这不是ReadInData() 需要的。

【讨论】:

    猜你喜欢
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2021-10-26
    相关资源
    最近更新 更多