имя функции c ++ не найдено, если оно перегружает имя функции ac? - PullRequest
1 голос
/ 09 ноября 2010

Я пытался переопределить функцию стиля C (func) в библиотеке с функцией стиля C ++, принимающей разные аргументы, как показано в коде ниже.

Я скомпилировал test.cpp в общийбиблиотека libtest.so, и скомпилировал main.cpp и связал его с библиотекой libtest.so.Это все работает, вплоть до этапа связывания, где я получаю undefined reference to 'func(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'.

Может кто-нибудь объяснить мне, почему компоновщик не может разрешить функцию C ++?Я проверил с помощью nm, что обе функции действительно есть в библиотеке.Ошибка компоновщика возникает как в компиляторах intel, так и в g ++.

test.h:

extern "C" {
int func( char* str, int size  );
}
#include <string>
int func( std::string str );

test.cpp:

#include <stdio.h>
#include <string>
#include "test.h"

int func( char *buf, int size )
{
   return snprintf( buf, size, "c-style func" );
}

int func( std::string& str )
{
    str = "c++-style func";
    return str.size();
}

main.cpp:

#include <iostream>
#include <string>
#include "test.h"

int main()
{
   char buf[1024];
   func( buf, 1024 );
   std::cout << buf << "\n";

   std::string str;
   func( str );
   std::cout << str << "\n";
}

1 Ответ

5 голосов
/ 09 ноября 2010

Вы объявили функцию в test.h как int func(std::string), но определили ее в test.cpp как int func(std::string &). Видишь разницу?

...