C++在模板类中的友好关系,接口与实现的分离

C++ friends in template classes, separation of interface and implementation

本文关键字:接口 实现 分离 友好关系 C++      更新时间:2023-10-16

以下代码运行良好:

h级:

#ifndef ClassLoaded
#define ClassLoaded
#include <iostream>
template <class T> class Class{
    public:
        template <class T> friend std::ostream& operator<<(std::ostream& Stream, const Class<T>& Op);
};
#endif

Class.cpp:

#include "Class.h"
template class Class<int>;
template std::ostream& operator<<(std::ostream& Stream, const Class<int>& Op);
template <class T> std::ostream& operator<<(std::ostream& Stream, const Class<T>& Op){
    return(Stream);
}

Main.cpp:

#include "Class.h"
#include <iostream>
using namespace std;
int main(){
    Class<int> Test;
    cout << Test << endl;
    return(0);
}

但下面的扩展版本给出了一个链接器错误(未解析的外部符号),我或多或少理解原因。但是如何修复呢?

h级:

#ifndef ClassLoaded
#define ClassLoaded
#include <iostream>
template <class T> class Class{
    public:
        class SubClass{
            public:
                friend std::ostream& operator<<(std::ostream& Stream, const SubClass& Op);
        };
        template <class T> friend std::ostream& operator<<(std::ostream& Stream, const Class<T>& Op);
    private:
        SubClass Member;
};
#endif

Class.cpp:

#include "Class.h"
template class Class<int>;
template std::ostream& operator<<(std::ostream& Stream, const Class<int>& Op);
template <class T> std::ostream& operator<<(std::ostream& Stream, const typename Class<T>::SubClass& Op){
    return(Stream);
}
template <class T> std::ostream& operator<<(std::ostream& Stream, const Class<T>& Op){
    Stream << Op.Member;
    return(Stream);
}

Main.cpp:

#include "Class.h"
#include <iostream>
using namespace std;
int main(){
    Class<int> Test;
    cout << Test << endl;
    return(0);
}

我想我需要一个线路的模拟

template class Class<int>;
template std::ostream& operator<<(std::ostream& Stream, const Class<int>& Op);

对于SubClass,以及的某种模板版本

friend std::ostream& operator<<(std::ostream& Stream, const SubClass& Op);

但是怎么做呢?

编辑:由于这是另一个问题的重复:我在这里的问题非常具体(见下面的评论),引用的问题没有回答,甚至没有提到。

只需在.hpp文件中提供模板函数的定义。我认为以下应该有效:

template <class T> class Class {
    SubClass member;
public:
    class SubClass {
        public:
        friend std::ostream& operator<<(std::ostream& Stream, const Class<T>& Op) {
            return Stream;
        }
    };
}