模板类中的C ++朋友,接口和实现的分离 [英] C++ friends in template classes, separation of interface and implementation

查看:120
本文介绍了模板类中的C ++朋友,接口和实现的分离的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下代码可以正常工作:

The following code works fine:

Class.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:

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);
}

,但是以下扩展版本给出了链接器错误(未解析的外部符号),我或多或少地了解了原因.但是如何解决呢?

but the following extended version gives a linker error (unresolved external symbol) and I do more or less understand why. But how to fix it?

Class.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:

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);
}

我想我需要线条的类似物

I guess I need an analogue of the lines

template class Class<int>;

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

用于SubClass以及某些模板版本

for SubClass and also some sort of template version of

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

但是怎么做?

因为它被认为是另一个问题的重复:我的问题在这里非常具体(请参阅下面的评论),并且未被引用的问题回答,甚至没有被提及.

As this was claimed to be a duplicated of another question: My question here is very specific (see comments below) and is not answered by the quoted questions or even mentioned there.

推荐答案

只需在.hpp文件中提供模板函数的定义. 我相信以下方法应该有效:

Just provide the definitions of the template functions in the .hpp files. I believe the following should work:

template <class T> class Class {
    SubClass member;
public:
    class SubClass {
        public:

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

这篇关于模板类中的C ++朋友,接口和实现的分离的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆