Есть ли способ специализации функции (скажем, 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
(Я понимаю, объявляя друга swap
, что можно найти с помощью ADL позволяет избежать этой проблемы для swap
, но это не имеет никакого отношения к моему вопросу. swap
- просто пример.)
ставить «своя своя» (внутренняя, внутренняя) 'inside' Outer'? – TemplateRex
@TemplateRex: Это не будет специализироваться на 'std :: swap', это просто функция nonmember под названием swap. – Mehrdad
Вы не можете специализировать класс, который не отображается. Поскольку 'struct' объявляется с закрытым доступом, только' Outer' может его видеть. Таким образом, вы не можете создать функцию, отличную от Outer-member, которая может ее увидеть, - чтобы вы не специализировались на ней. –