Что я делаю не так ?, ссылки в C ++ - PullRequest
2 голосов
/ 18 апреля 2010

Я пытаюсь закодировать простой кодировщик / декодер base64 (чтобы проверить свои навыки программирования).

Я могу скомпилировать его, но он не связывает, у меня ошибка с сообщением:

C: \ Documents and Settings \ Facon \ Escritorio> g ++ base64.o main.o -o prueba.exe

main.o: main.cpp :(. Text + 0x24a): неопределенная ссылка на `Base64Encode (std :: vector> const &) '

collect2: ld вернул 1 статус выхода

Компилятор и компоновщик: Mingw32 3.4.5 ТАК: Windows XP

Это мой исходный код:

base64.h:

#ifndef BASE64_H
#define BASE64_H

#include <iostream>
#include <vector>

typedef unsigned char byte;

std::string Base64Encode(const std::vector<byte> &array);
std::vector<byte> Base64Decode(const std::string &array);

#endif

base64.cpp:

#include "base64.h"

std::string Base64Encode(std::vector<byte> &array)
{
 const char *base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 const unsigned int size = array.size();
 std::string output;

 for (unsigned int i = 0; (i < size); i++)
 {
  if ((size - i) > 3)
  { 
   output.push_back(static_cast<char>(base64_table[array[i] >> 2]));
   output.push_back(static_cast<char>(base64_table[((array[i++] & 0x03) << 4) | ((array[i] & 0xF0) >> 4)]));
   output.push_back(static_cast<char>(base64_table[((array[i++] & 0x0F) << 2) | ((array[i] & 0xC0) >> 4)]));
   output.push_back(static_cast<char>(base64_table[array[i] & 0x3F]));
  }
  else if ((size - i) == 3)
  {
   output.push_back(static_cast<char>(base64_table[array[i] >> 2]));
   output.push_back(static_cast<char>(base64_table[((array[i++] & 0x03) << 4) | ((array[i] & 0xF0) >> 4)]));
   output.push_back(static_cast<char>(base64_table[(array[i] & 0x0F) << 2]));
   output.push_back(static_cast<char>('='));
  }
  else if ((size - i) == 2)
  {
   output.push_back(static_cast<char>(base64_table[array[i] >> 2]));
   output.push_back(static_cast<char>(base64_table[(array[i] & 0x03) << 4]));
   output.push_back('=');
   output.push_back('=');
  }
 }

 return output;
}

std::vector<byte> Base64Decode(const std::string &array) // TODO
{
 const char *base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
}

main.cpp:

#include <iostream>
#include <vector>
#include "base64.h"

using namespace std;

int main(int argc, char *argv[])
{
 const char* prueba = "sure.";
 vector<byte> texto;
 string codificado;

 for (unsigned int i = 0; (prueba[i] != 0); i++)
 {
  texto.push_back(prueba[i]);
 }

 codificado = Base64Encode(texto);

 cout << codificado;

 return 0;
}

PD: Извините за плохое знание английского: P

Ответы [ 3 ]

4 голосов
/ 18 апреля 2010

Вам не хватает const в реализации Base64Encode, оно объявлено как:

std::string Base64Encode(const std::vector<byte> &array);

Но реализовано как

std::string Base64Encode(std::vector<byte> &array) { ... }

Компилятор считает, что вы перегрузили функцию (для константных и неконстантных векторов) и считает, что реализация константной версии отсутствует.

2 голосов
/ 18 апреля 2010

Ваш заголовок объявляет Base64Encode для принятия типа const std::vector<byte> &array, в то время как ваш исходный файл объявляет его для принятия типа std::vector<byte> &array - обратите внимание на отсутствующий квалификатор const.

Таким образом, хотя base64.cpp компилируется правильно, оно не связывается с объявлением в заголовке, которое является единственным прототипом, о котором знает main.cpp. Когда компоновщик работает, main ищет подпись с квалификатором const, но ее нигде не найти.

1 голос
/ 18 апреля 2010

Аргумент Base64Encode объявлен как const в заголовке, но не является константным в файле .cpp.

...