Следующий код компилируется с использованием GCC 4.4.6 и Comeau 4.3.10.
#include <iostream>
struct A { int name; };
template<typename T> struct C : T { using T::name; };
struct B : private A { friend struct C<B>; };
int main()
{
C<B> o;
o.name = 0;
}
Это дает следующую ошибку в VC ++ 10:
main.cpp(4): error C2877: 'A::name' is not accessible from 'A' main.cpp(10): error C2247: 'A::name' not accessible because 'B' uses 'private' to inherit from 'A'
Какой хороший обходной путь кросс-компилятора позволяет o.name = 0;
?
Замечания: Добавление using A::name
в B
заботится о проблеме, но публикует A::name
член для всех, в то время как он должен быть видимым только для конкретного экземпляра шаблона, а именно C<B>
,
Обходной путь — это то, что предложил @kerrekSB, добавьте using A::name;
в классе B
:
struct A { int name; };
template<typename T> struct C : T { using T::name; };
struct B : private A {
using A::name;
friend struct C<B>;
};
Ваш первоначальный пример не работал, потому что класс A
является частным B
и класс C<B>
друг B
но когда вы получаете доступ к члену name
от объекта C<B>
, линия using T::name;
создает проблему, так как класс B
не имеет ни одного члена name
в этом. это область поиска, которая находит члена name
когда вы пытаетесь получить к нему доступ через объект класса B
Редактировать :
Добавление с помощью A :: name к B решает проблему, но публикует
Член :: name каждому, тогда как он должен быть виден только
конкретный экземпляр шаблона, а именно C
если это так, то просто объявить заявление using A::name;
в приватной секции в классе B
т.е.
struct B : private A {
protected: using A::name;
public:
friend struct C<B>;
};
Кажется, есть принципиальное различие в соображениях видимости между GCC и VC ++ при использовании декларации об использовании членов; проверьте этот упрощенный пример без шаблонов:
struct A { int name; };
struct B: private A { friend struct C; };
struct C: B {using B::name; };
int main()
{
C o;
o.name = 0;
}
Он скомпилируется на gcc, но не на VC ++ (с той же ошибкой, что и в вопросе). Нужно будет проконсультироваться со стандартом о том, кто делает это правильно …