【问题标题】:C++: Overload << Operator with templates [duplicate]C ++:使用模板重载<<运算符[重复]
【发布时间】:2013-11-13 15:13:04
【问题描述】:

不幸的是,我找不到关于我的以下问题的帖子。 我想写一个重载

class MyClass {

    private:
       ...

    public:
        template <typename> void operator<<(T data);
};

CPP 文件:

template <typename T> void MyClass::operator<<(T data) {
    ...
    return;
}

现在我想使用我的班级:

MyClass mc;
mc << "Test";
mc << 123; 

但是我的 gcc 编译器不会编译它,给我以下错误消息:

undefined reference to `void MyClass::operator<< <char const*>(char const*)'

或者如果我使用 int 例如:

undefined reference to `void MyClass::operator<< <int>(int)'

我做错了什么???有人可以帮帮我吗?

【问题讨论】:

标签: c++ templates overloading operator-keyword


【解决方案1】:

您必须将实现从 .cpp 移至 .h 文件。可以直接就地定义:

class MyClass {

    private:
       ...

    public:
        template <class T> 
        void operator << (const T& data)
        {
            //do stuff based on T

            cout << data << " with size:" << sizeof(T);
        }
};

【讨论】:

  • 不完全准确。您没有必须将其移出 .cpp 文件,您只需确保编译器可以实例化您想要使用的类型。如果您事先知道您将使用哪些类型,那么另一种方法是explicit instantiation。此外,一种常见的做法是将定义放在单独的实现标头中,并将该文件包含在 .h 文件的末尾。
  • @JBentley 你是对的,但我想保留细节以防止对问题提供的示例产生误解。
  • 谢谢大家的回答!我将函数实现移到头文件中,它起作用了!
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2012-11-14
  • 2021-09-19
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多