无法将vector <string>作为函数参数C ++ </string>传递

时间:2013-01-28 00:24:34

标签: c++ vector parameter-passing

所以这是我正在使用的代码。我希望能够将所有输入传递给此函数new_flight,其中当前没有其他代码的空代码。我正在尝试通过引用传递令牌,但我已尝试使用* &并且仅使用值,并且似乎都没有。

#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 )的行,它编译得很好。

谢谢你看看

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

#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之后定义了这个功能,所以编译器需要知道函数存在,因此我们创建了一个定义函数的“prototype”void new_flight( vector<string> &tokens );