gpt4 book ai didi

c++ - 无法为模板类中的 friend 找出VS2019中的链接器错误

转载 作者:行者123 更新时间:2023-12-02 10:17:22 25 4
gpt4 key购买 nike

请注意-StackOverflow找到了许多与此示例类似的示例。我经历了每一遍,但仍然无法编译我的代码。这可能与另一个问题类似,但是如果您说的是-请确保示例中显示的技术允许将代码进行编译。提前致谢。

我在玩一些基本的代码,试图作为C++的学生变得更好。我确定这是一个简单的错误/错误,但是我无法弄清楚:

#include <iostream>
#include <string>

// General templated class
template <typename T>
class AddElements {
private:
T lhs;
T rhs;
public:
AddElements(T lhs_init=T(), T rhs_init=T()): lhs{lhs_init}, rhs{rhs_init} { }
T add() { return lhs + rhs; }

friend std::istream& operator>>(std::istream&, const AddElements&);
};

template <typename T>
std::istream& operator>>(std::istream& istr, const AddElements<T>& ae) {
istr >> ae.lhs;
istr >> ae.rhs;
return istr;
}

int main() {
std::size_t lines;
std::string line_types;
AddElements<int> mycol_ints;

std::cin >> lines;
std::cin >> mycol_ints;

return 0;
}

我正在使用Visual Studio 2019的C++编译器:
$env:cl = "/EHsc /Wall /external:anglebrackets /external:W3 /external:templates- /experimental:external /RTCsu /sdl /analyze /std:c++17"

cl classtemplates.cpp
(...)
/out:classtemplates.exe
classtemplates.obj
classtemplates.obj : error LNK2019: unresolved external symbol "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class AddElements<int> const &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$AddElements@H@@@Z) referenced in function _main
classtemplates.exe : fatal error LNK1120: 1 unresolved externals

指向精美手册的指针。我花了一段时间在谷歌上搜索并在cppreference.com上查看示例,但现在我很困惑。

最佳答案

friend 声明引用的是非模板运算符,而定义是模板运算符,但它们不匹配。

你可能想要

template <typename T>
class AddElements;
template <typename T>
std::istream& operator>>(std::istream& istr, AddElements<T>& ae);

template <typename T>
class AddElements {
private:
T lhs;
T rhs;
public:
AddElements(T lhs_init=T(), T rhs_init=T()): lhs{lhs_init}, rhs{rhs_init} { }
T add() { return lhs + rhs; }

friend std::istream& operator>> <>(std::istream&, AddElements&);
// ^^
// refer to the instantiation of the template operaotr>>
};

template <typename T>
std::istream& operator>>(std::istream& istr, AddElements<T>& ae) {
istr >> ae.lhs;
istr >> ae.rhs;
return istr;
}

或者您可以使其成为非模板并在类中内联定义
template <typename T>
class AddElements {
private:
T lhs;
T rhs;
public:
AddElements(T lhs_init=T(), T rhs_init=T()): lhs{lhs_init}, rhs{rhs_init} { }
T add() { return lhs + rhs; }

friend std::istream& operator>> (std::istream& istr, AddElements& ae) {
istr >> ae.lhs;
istr >> ae.rhs;
return istr;
}
};

顺便说一句:参数 ae应该声明为非常量;应该在 operator>>中进行修改。

关于c++ - 无法为模板类中的 friend 找出VS2019中的链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61471302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com