c++ - 模板化运算符<<显式实例化和 header

标签 c++ templates

通常对于我的模板类,我在 .hpp 中包含声明.t.hpp 中的文件和模板化实现代码文件。我在 .cpp 中显式实例化该类文件:

template class MyClass< AnotherClass >;

其目标代码被放入库中。

问题是,如果我尝试使用 operator<< 打印对象,在 .hpp 中声明文件并在 .t.hpp 中定义文件为:

template<class T>
std::ostream& operator<<( std::ostream& os, const MyClass<T>& c)
{
    os  << "Hello, I am being output.";
    return os;
}

我收到链接器错误,指出正确的符号未定义。

我理解这是因为这个模板化函数在类创建时没有显式实例化。除了包含 .t.hpp 之外,还有其他方法可以解决此问题吗?任何时候我想使用operator<<在类上,或将模板化函数代码移至 .hpp文件?我可以显式实例化函数代码吗?

最佳答案

您可以显式实例化函数模板

template std::ostream& operator<<(std::ostream&, const MyClass<int>&);

使用 T = int 实例化特化。如果可以推导出所有模板参数(例如,从类型 MyClass<int> 推导出来),则可以省略模板参数括号。如果不能,例如因为模板参数不会出现在函数参数类型中,则可以明确指定它

template<typename T> void f() { }
template void f<int>();

关于c++ - 模板化运算符<<显式实例化和 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1013979/

相关文章:

c++ - 是否可以使用vector <T>作为值来定义unordered_map?

javascript - Handlebars 中的条件

c++ - NASM 64 位中的段错误

c++ - 无法使用多个模板定义重载函数?

c++ - 无法在应用程序启动后立即使用 ShowCursor(FALSE) 隐藏鼠标光标

c++ - 如何为命令行应用程序编写 Python 绑定(bind)

c++ - 将 IO 寄存器作为模板参数传递

templates - 使用 Modernizr 的网站/网页模板?

c++ - 如何在 C 或 C++ 中编写简单的正则表达式模式匹配函数?

c++ - 使用 files_put 上传 DropBox 返回身份验证失败