【问题标题】:Trouble passing vector<string> as function parameter C++将 vector<string> 作为函数参数 C++ 传递时遇到问题
【发布时间】:2013-01-11 07:26:21
【问题描述】:

这是我正在使用的代码。我希望能够将所有输入传递给这个函数new_flight,除了一个空声明之外,目前没有其他代码。我正在尝试通过引用传递令牌,但我已经尝试使用 * &amp; 并且只是按值传递,但似乎没有一个有效。

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>
#include <iterator>

using namespace std;

void new_flight( vector<string> &tokens );

int main( int argc, char *argv[] )
{
    vector<string> tokens;

    cout << "Reservations >> ";
    getline(cin, input);
    istringstream iss( input );
    copy(istream_iterator<string>( iss ),
         istream_iterator<string>(),
         back_inserter<vector<string> > ( tokens ));

    new_flight( tokens );
}

这是编译器告诉我的内容

Undefined symbols for architecture x86_64:
  "new_flight(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)", referenced from:
      _main in ccplPBEo.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

如果我注释掉我实际将令牌传递给 new_flight new_flight( tokens ) 的行,它编译得很好。

感谢观看

【问题讨论】:

  • 你有没有实现new_flight函数?

标签: c++ vector parameter-passing


【解决方案1】:

您得到的不是编译器错误,而是 链接器 错误,这是由于您的函数 new_flight() 未定义。但你似乎意识到了这个事实。如果您调用一个未定义的函数,您不能期望您的程序能够工作,因此链接器首先拒绝创建它。

【讨论】:

    【解决方案2】:

    您不能调用声明。你需要一个定义。编译器应该为这个调用生成什么代码?它没有该功能的代码。您的程序无法编译。

    【讨论】:

      【解决方案3】:

      您声明了函数new_flight,但没有定义它,因此链接器无法链接它。编写实现(如果只有存根),它将编译。

      【讨论】:

        【解决方案4】:

        为了存根一个函数,你需要提供一个函数定义,而不是一个函数声明:

        void new_flight( vector<string> &tokens ) {
            // Not implemented
        }
        

        【讨论】:

          【解决方案5】:

          正如其他帖子指出的那样:

          #include <iostream>
          #include <string>
          #include <sstream>
          #include <algorithm>
          #include <vector>
          #include <iterator>
          
          using namespace std;
          
          void new_flight( vector<string> &tokens );
          
          int main( int argc, char *argv[] )
          {
             vector<string> tokens;
          
             cout << "Reservations >> ";
             getline(cin, input);
             istringstream iss( input );
             copy(istream_iterator<string>( iss ),
               istream_iterator<string>(),
               back_inserter<vector<string> > ( tokens ));
          
             new_flight( tokens );
          }
          
          void new_flight( vector<string> &tokens ) 
          {
          
             // implementation
          }
          

          因为您实际上是在 main 之后定义功能,所以编译器需要知道该函数存在,因此我们创建了一个“原型”void new_flight( vector&lt;string&gt; &amp;tokens ); 来定义该函数。

          【讨论】:

            猜你喜欢
            • 2012-12-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多