Частное наследование шаблона в vc ++ 10 недоступно

Следующий код компилируется с использованием 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>,

7

Решение

Обходной путь — это то, что предложил @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>;
};
5

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

Кажется, есть принципиальное различие в соображениях видимости между 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 ++ (с той же ошибкой, что и в вопросе). Нужно будет проконсультироваться со стандартом о том, кто делает это правильно …

2

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