1

所以这是我正在使用的代码。我希望能够将所有输入传递给该函数,该函数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 )它编译得很好。

谢谢参观

4

5 回答 5

3

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

void new_flight( vector<string> &tokens ) {
    // Not implemented
}
于 2013-01-28T00:27:08.737 回答
2

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

于 2013-01-28T00:26:21.260 回答
2

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

于 2013-01-28T00:27:00.250 回答
1

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

于 2013-01-28T00:26:30.900 回答
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 之后定义功能,所以编译器需要知道该函数存在,因此我们创建了一个void new_flight( vector<string> &tokens );定义该函数的“原型”。

于 2013-01-28T00:29:24.890 回答