gpt4 book ai didi

c++ - 函数模板重载 - 排序

转载 作者:行者123 更新时间:2023-11-30 01:54:52 25 4
gpt4 key购买 nike

我不明白。我知道函数模板是邪恶的,但在这种情况下我们必须使用它。所以这不是问题。我们有一个使用模板运算符函数的存档。对象/值类型的特化遵循模板函数声明/定义之后:

class BaseArchive
{
public:
BaseArchive() {}
virtual ~BaseArchive();

template< typename T >
BaseArchive & operator<<(const T &t)
{
::operator<<(*this, t);
return *this;
}
};

BaseArchive & operator<<(BaseArchive &ar, const int & i)
{
return ar;
}

class StdArchive : public BaseArchive
{
public:
StdArchive();

template< typename T >
StdArchive & operator<<(const T &t)
{
::operator<<(*this, t);
return *this;
}
};

int main()
{
BaseArchive ar;
int i = 7;
ar << i;
}

对于这个例子,我们得到一个错误:

::运算符<<尚未声明

这个可以通过

的前向声明来修复
class BaseArchive;
BaseArchive & operator<<(BaseArchive &ar, const int & i);

class Archive { ...

到目前为止一切顺利。但是之后一些类为存档定义了自己的::operator ,因此很难甚至不可能确保特定的运算符声明总是出现在 archive-header-include 之前,甚至我们也不想使用全局运算符 inlcude 文件。

知道如何解决这个问题和/或解释为什么会出现这个错误吗?像往常一样,VS 编译器不关心这个,但是 minGW (gcc) 编译器关心...

非常感谢

最佳答案

首先,函数模板并不邪恶。你从哪里得到这个想法的?

其次,您的设置没有意义。为什么成员函数模板是operator <<那里?它除了转发到全局版本外什么都不做,并且因为它使用显式限定,所以 ADL 不适用。

去掉成员函数模板,靠ADL找到正确的operator<< .

关于c++ - 函数模板重载 - 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21457521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com