gpt4 book ai didi

c++ - operator << friend 函数和模板

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:06 25 4
gpt4 key购买 nike

这是我的代码:

动画.h

#include <iostream>

template< class T>
class Movie {
public:
Movie(T in) {
a = in;
}

friend std::ostream& operator<<(std::ostream& os, const Movie<T>& movie);
private:
T a;
};

template<class T>
std::ostream& operator<<(std::ostream& os, const Movie<T>& movie) {
return os;
}

主要.cpp

#include "mov.h"

int main() {
Movie<int> movie1(1);

std::cout << movie1 << std::endl;

return 0;
}

我尝试编译这段代码,但出现错误:

Error 1 error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Movie<int> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$Movie@H@@@Z) referenced in function _main    c:\Users\Adi\documents\visual studio 2013\Projects\bdika01\bdika01\main.obj bdika01
Error 2 error LNK1120: 1 unresolved externals c:\users\adi\documents\visual studio 2013\Projects\bdika01\Debug\bdika01.exe 1 1 bdika01

如果我像这样尝试内联代码就没问题:

动画.h

 #include <iostream>

template<class T>
class Movie {
public:
Movie(T in) {
a = in;
}

friend std::ostream& operator<<(std::ostream& os, const Movie<T>& movie){
return os;
}
private:
T a;
};

如果想把定义和声明分开怎么办?

谢谢。

最佳答案

template <typename T> class Movie;

template<class T>
std::ostream& operator<<(std::ostream& os, const Movie<T>& movie);

template< class T>
class Movie {
friend std::ostream& operator<< <T>(std::ostream& os, const Movie<T>& movie);
};

template<class T>
std::ostream& operator<<(std::ostream& os, const Movie<T>& movie){
return os;
}

在您的原始代码中,您与一个非模板函数成为 friend ,该函数恰好采用了 Movie<> 的正确实例化。作为参数。所以,每次 Movie<T>被实例化,相应的非模板operator<<在封闭的命名空间范围内声明(但未定义)。 friend这样的声明很奇怪。

此外,您声明并定义了一个名为operator<< 的函数模板。 (这不是 Movie 的任何实例化的 friend )。但是,重载解析更喜欢非模板,其他条件相同。

关于c++ - operator << friend 函数和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25297420/

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