C++在模板类中的友好关系,接口与实现的分离
C++ friends in template classes, separation of interface and implementation
以下代码运行良好:
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;
}
};
}
相关文章:
- 如何从实现接口的模板化类实例访问结构
- 传递实现特定接口的类
- 如何在C++中实现接口
- C++ 使用接口和默认实现继承
- unique_ptr实现接口时对已删除函数的引用
- C++接口实现和子类化对象识别
- 接口实现和私有继承之间的交互
- Pimpl习惯用法、单独的接口/实现文件和多个虚拟继承.如何
- 定义大量的接口实现
- cpp文件中的纯虚拟接口实现
- 如何使用接口实现回调
- 继承接口实现
- 如何在C++中编写类java参数级接口实现
- 具有其他默认参数的接口实现
- Mixin和接口实现
- 如何在许多类中重用接口实现
- Emscripten Javascript接口实现
- 获取Firefox内置组件的接口实现
- c++中的头文件和Java中的抽象类/接口实现是相同的想法,这是正确的吗?
- C++中的接口+实现:代码不执行