Включить перегрузки операторов из другого файла - PullRequest
0 голосов
/ 08 ноября 2019

Я хочу использовать оператор, определенный в другом файле и, если возможно, также в другом пространстве имен, вот что у меня есть.

(operator.hpp)

#ifndef __OPERATORS__HPP__
#define __OPERATORS__HPP__

#include "proto_handler.hpp"

#include <iostream>

namespace apius {
namespace support {
namespace operators{

std::istream& operator>>(std::istream& in,
                         inventory::proto::item& item);
}
}
}

(operatos.cpp)

#include "operators.hpp"

namespace apius {
namespace support {
namespace operators{

std::istream& operator>>(std::istream& in,
                         inventory::proto::item& item){
    //code here
}

}
}
}

(another_file.cpp)

#include "operators.hpp"

extern std::istream& operator>>(std::istream& in,
                         inventory::proto::item& item);
void test(){
    inventory::proto::item new_item;
    std::cin>>new_item;
}

и я получаю неопределенную ссылку на оператор в строке, содержащей std :: cin

Что я могу сделатьсделать эту работу?

1 Ответ

2 голосов
/ 08 ноября 2019

Обычно компоновщик пытается найти такой символ, потому что его нет ни у кого. Из-за искажения имени в C ++ вы получите что-то вроде __ ZN5apius7support9operatorsrsERNSt3__113basic_istream ... в вашей таблице символов в объектном файле. Обратите внимание, что часть пространства имен тоже есть. Но вы говорите, что есть такой оператор в глобальном пространстве имен. Как правильно заметил Адриан, вы можете просто добавить

using namespace apius::support::operators;

Более того, я предпочитаю делать это, объявляя оператор друга в классе, и тогда вам не нужны никакие использования.

...