2015-08-25 4 views
0

Клянусь, я искал по всему Интернету и так для этой точной проблемы, но не мог найти никаких решений.Как неструктурированная структура, вложенная внутри шаблонизированного внешнего класса, получает доступ к статическим членам внешнего класса?

Вот установка:

template <typename T> 
class Foo { 
    static bool bar; 

public: 
    struct Baz { 
    void quux() { 
     // I want to access bar here 
    } 
    }; 
    // friend typename struct Foo<T>::Baz; 
    // The above works, but I'm not sure if it's what I need? 
}; 

Это то, что я пытаюсь сделать это возможно?

+1

Пробовали ли вы и если вы сделали, вы получите какие-либо ошибки? также см .: http://stackoverflow.com/questions/486099/can-inner-classes-access-private-variables – NathanOliver

+0

В этой ситуации нет шаблона. Я пытаюсь понять, как вы относитесь к внешнему классу. Я пробовал 'Foo :: bar' и' bar', и ни один из них не работает. –

+0

Это отлично работает: http://ideone.com/JDKixN – imreal

ответ

2

Доступ не является проблемой, просто используйте Foo<T>::bar в пределах Baz. Я думаю, что большая проблема заключается в том, что вам нужно выделить хранилище для Foo<T>::bar. Это означает, что в вашем файле Foo.cpp вам нужно будет фактически создать экземпляр всех шаблонов, которые вы можете использовать. Например:

template <typename T> 
class Foo { 
    static bool bar; 
public: 
    struct Baz { 
    void quux() { 
     // I want to access bar here 
     Foo<T>::bar = true; 
    } 
    }; 
    static bool getBar() { return bar; } 
}; 

// allocating storage for bars 
template<> 
bool Foo<int>::bar = false; 
template<> 
bool Foo<double>::bar = false; 

int main() { 
    Foo<int> fint; 
    Foo<double> fouble; 
    cout << Foo<int>::getBar() << " " << Foo<double>::getBar() << '\n'; 
    Foo<int>::Baz baz; 
    baz.quux(); // alter int bar 
    cout << Foo<int>::getBar() << " " << Foo<double>::getBar() << '\n'; 
} 

Live demo

+0

Спасибо, я просто идиот. Я не использовал C++ некоторое время и в основном, я пытался вызвать 'quux();' в конструкторе для 'Baz', но я объявлял конструктор перед объявлением' quux'. Я так привязался, пытаясь обмануть решение проблемы, которую я пытался решить с помощью шаблонной логики (и, видимо, я сделал эту часть отлично), что я забыл некоторые основы C/C++: v Спасибо за ваш подробный ответ, хотя ! –

+0

Рад, что я мог бы помочь :) –

+0

Хотя, как сказано выше, это кажется неудачным, когда вы на самом деле называете 'quux()' где угодно, как в конструкторе для 'Baz'. Почему это? –

1

"Is what I'm trying to do possible?"

Нет, они по-прежнему являются отдельными (хотя и вложенными) и несвязанными классами с помощью сферы или наследования.

// friend typename struct Foo<T>::Baz; 
// The above works, but I'm not sure if it's what I need? 

Я также не уверен, если это то, что вам действительно нужно, но так как Baz объявлен в private разделе Foo<T> вы не можете получить доступ к нему, если предоставление декларации в friend класс к (где внутренний класс, по-видимому, является хорошим выбором) или сделать const членом public.

+0

Это не 'static const', это просто' static', но это мой вопрос: на '// I хотите перейти к строке bar здесь ', как я могу обратиться к' bar'? 'bar' может быть общедоступным, если это упростит, но я бы хотел, чтобы он был приватным и настроил отношения' friend' с 'Baz', так что только те' Foo 'себя и' Baz' могут получить доступ к ' bar'.Я буду иметь другие классы, наследуемые от 'Foo ' (CRTP; 'class Quux: Foo '), и я не хочу, чтобы дочерний класс 'Quux' мог получить доступ к' bar', если это возможно. –

+0

@ takua108 На самом деле не имеет значения, действительно ли это 'static const' или просто' const', это вопрос видимости в сфере видимости. –