#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
и предпочитаю объявлять перегрузки операторов как свободные функции, что пока не вызвало у меня серьезных проблем. Я надеюсь, что кто-то другой сможет ответить на это.