专门为一个私人班级设计一个功能
Specializing a function for a private class?
有没有办法为私有类专门化函数(比如std::swap
)?
例如,当我测试这个:
#include <algorithm>
class Outer
{
struct Inner
{
int a;
void swap(Inner &other)
{
using std::swap;
swap(this->a, other.a);
}
};
public:
static void test();
};
namespace std
{
template<> void swap<Outer::Inner>(Outer::Inner &a, Outer::Inner &b)
{ a.swap(b); }
}
void Outer::test()
{
using std::swap;
Inner a, b;
swap(a, b);
}
int main()
{
Outer::test();
return 0;
}
我得到这个:
Test.cpp:20:47: error: 'Inner' is a private member of 'Outer'
template<> void swap<Outer::Inner>(Outer::Inner &a, Outer::Inner &b)
^
Test.cpp:5:12: note: implicitly declared private here
struct Inner
^
Test.cpp:20:64: error: 'Inner' is a private member of 'Outer'
template<> void swap<Outer::Inner>(Outer::Inner &a, Outer::Inner &b)
^
Test.cpp:5:12: note: implicitly declared private here
struct Inner
^
Test.cpp:20:33: error: 'Inner' is a private member of 'Outer'
template<> void swap<Outer::Inner>(Outer::Inner &a, Outer::Inner &b)
^
Test.cpp:5:12: note: implicitly declared private here
struct Inner
(我确实意识到,声明一个可以通过ADL找到的朋友swap
可以避免swap
的这个问题,但这与我的问题无关。swap
只是一个例子。)
您可以在Outer
中添加std::swap<Inner>(Inner&, Inner&)
的friend
声明
#include <algorithm>
class Outer
{
struct Inner
{
int a;
void swap(Inner &other)
{
using std::swap;
swap(this->a, other.a);
}
};
friend void std::swap<Inner>(Inner&, Inner&) noexcept;
public:
static void test();
};
namespace std
{
template<> void swap<Outer::Inner>(Outer::Inner &a, Outer::Inner &b) noexcept
{ a.swap(b); }
}
void Outer::test()
{
using std::swap;
Inner a, b;
swap(a, b);
}
int main()
{
Outer::test();
return 0;
}
实时示例
不要扩展std
命名空间。
如果要为Inner
创建交换函数,请将其作为Outer
中的私有函数
#include <algorithm>
class Outer
{
struct Inner
{
int a;
void swap(Inner &other)
{
std::swap(this->a, other.a);
}
};
static void swap(Inner& a, Inner& b);
public:
static void test();
};
void Outer::test()
{
Inner a, b;
swap(a, b);
}
void Outer::swap(Inner& a, Inner& b)
{
a.swap(b);
}
int main()
{
Outer::test();
return 0;
}
相关文章:
- 如何在一个功能中拥有所有选项?
- 使用一个功能打印最大值和平均值
- 如何简化代码并将开关组合成一个功能?
- 当一个功能完成另一个功能打开时,我该怎么办?
- 仅一个功能的链接错误.在同一类和CPP文件中具有相似签名的其他函数工作正常
- 为什么我要尝试在一个if语句中调用两个fucntions,但是在第一个完成后它忽略了另一个功能?(C )
- C++中是否有一个功能可以创建一个像Python的"numpy.bmat"一样简单的块矩阵?
- 当指针作为指向另一个功能内部指针的指针传递时会发生什么
- 是什么导致程序在我继续执行另一个功能之前停止
- Android NDK生成海量只有一个功能的.so文件
- 如何制作新功能并将其传递到另一个功能
- 一个功能可以在几个线程上运行
- C 将用户输入从一个函数到另一个功能,并使用Main(Newbie)显示
- 如何从另一个功能中修改的结构的炭指针成员中获取值
- 编写一个功能,该函数将使用框架交换两个整数
- C 初学者可以在另一个功能中调用功能
- 将C 本地字符串返回到另一个功能
- CPPUNIT:我们真的每个测试需要一个功能吗?
- 使用另一个功能在另一个函数的变量
- 语言链接只属于一个功能吗?