有没有办法专门化私有类的函数(比如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
只是一个例子。)< / p>
答案 0 :(得分:4)
您可以在friend
std::swap<Inner>(Inner&, Inner&)
Outer
声明
#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;
}
答案 1 :(得分:1)
不要扩展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;
}