Может ли аргумент шаблона шаблона из другого пространства имен быть другом?

Я извиняюсь, если название этого вопроса менее чем полезно; Я не знаю краткого способа задать этот вопрос, не приведя следующий пример:

template <template <class> class Arg>
class C {
typedef C<Arg> type;
friend class Arg<type>;
public:
C() {
a_.set(this);
}
private:
int i_;
Arg<type> a_;
};

template <class Type>
class Arg1 {
public:
void set(Type* t) {
t_ = t;
t_->i_ = 1;
}
private:
Type* t_;
};

namespace NS {

template <class Type>
class Arg2 {
public:
void set(Type* t) {
t_ = t;
t_->i_ = 2;
}
private:
Type* t_;
};

}

Как вы видете, Arg2 является копией Arg1, Тем не менее, VS 2008 позволяет только Arg1 для использования в качестве аргумента шаблона:

int main() {
C<Arg1> c1; // compiles ok
C<NS::Arg2> c2; // error C2248

return 0;
}

Ошибка 'C<Arg>::i_' : cannot access private member declared in class 'C<Arg>', Все работает нормально если i_ обнародован, так что, похоже, это вопрос дружбы.

Что вызывает сбой объявления дружбы, когда аргумент шаблона шаблона находится в другом пространстве имен?

5

Решение

Членство в пространстве имен не влияет на право на дружбу. Это ошибка компилятора.

friend а также namespace Это языковые функции, которые взаимодействуют, так что это не особенно удивительно, поскольку ошибки идут. Возможно, это на самом деле означает бессмысленную форвардную декларацию во вложенном пространстве имен, ::Arg2<type>,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]