Объявление Operator<< перегрузка не распознает его определение

#c #scope

#c #область видимости

Вопрос:

У меня есть следующая структура:

 // [String.h]
namespace ns {
    class String {
            std::wstring m_string;
        public:
            const wchar_t* ToCString() const;
            friend ::std::ostreamamp; operator<<(::std::ostreamamp; os, const Stringamp; stringObject);
            // ...
    };
}


// [String.cpp]
std::ostreamamp; operator<<(std::ostreamamp; os, const ns::Stringamp; stringObject) {
    std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> conv;
    os << conv.to_bytes(stringObject.ToCString());
    return os;
}
  

Возникает следующая ошибка:
error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > amp; __cdecl ns::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > amp;,class ns::String const amp;)" (??6ns@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV12@ABVString@0@@Z) referenced in function _main

Я знаю, что при использовании этого способа namespace ns {} все будет работать, но есть ли другой способ, отличный от предыдущего, поскольку этот способ ns::method не подходит для метода friend?

Комментарии:

1. Вы реализовали функцию внутри правильного пространства имен? Вы не показываете пространство имен в своем cpp-файле.

2. @StephenNewell: В файле «.cpp» я использую этот способ, ns::method который я не использую namespace ns {} в файле «.cpp».

3. Возможно, вы захотите обновить свой код, чтобы он соответствовал этому, так как ns нигде в вашем cpp-коде нет ответа на этот вопрос.

4. @StephenNewell: Но этот способ ns::method не приемлем для компилятора, потому что это дружественная функция, не являющаяся членом класса.

Ответ №1:

Напишите свою реализацию operator<< в пространстве имен ns . Это было успешно скомпилировано в VS2019.

 // implementation in .cpp file.
namespace ns
{
    std::ostreamamp; operator<<(std::ostreamamp; os, const ns::Stringamp; stringObject)
    {
        std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> conv;
        os << conv.to_bytes(stringObject.ToCString());
        return os;
    }
}
  

Комментарии:

1. Что касается первой проблемы, это не настоящая проблема, это просто ошибка при копировании кода. и вторая проблема, в файле «.cpp», который я использую таким образом ns::method , я не использую` namespace ns {}` в файле «.cpp».

2. @LionKing Мне было интересно, как эта опечатка не была найдена в IDE, и я подумал, что это, возможно, произошло при копировании и вставке вашего кода. Я удалил первое.

3. @LionKing Я пытался ns::method и ns::String::method в первый раз, но потерпел неудачу. Я предполагаю, что это из-за friend ключевого слова, но я не могу быть уверен и опубликовал другой успешный код.

4. Я знаю, что при использовании этого способа namespace ns {} все будет хорошо, но есть ли другой способ, кроме этого, поскольку этот способ ns::method не подходит для метода friend?

5. @LionKing Я недостаточно хорош для вопроса. На самом деле я избегаю использования friend и предпочитаю объявлять перегрузки операторов как свободные функции, что пока не вызвало у меня серьезных проблем. Я надеюсь, что кто-то другой сможет ответить на это.