Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > перенсти код из g++ в msvc10


Автор: trupca 13.8.2013, 10:32
есть примерно такой код. его отлично хавает гцц, но не переваривает msvc10. чяднт? ругается на строку: struct foo<T>::bar foo<T>::operator[](int x). спрашивается а как ещё о можно разрешить доступ к struct bar из области видимости foo<t>? 

Код

#include <iostream> 
 
using namespace std; 
 
template <typename T> 
class foo { 
public: 
    struct bar { 
        T br;     
    }; 
 
    struct bar operator[](int); 
private: 
    T * bor; 
}; 
 
template <typename T> 
struct foo<T>::bar foo<T>::operator[](int x) { 
    struct Bar brrr; 
 
    return brrr; 
} 
 
int main() { 
     
 
    return 0; 
} 

Автор: DarthTon 13.8.2013, 11:34
Как-то так:
Код

template <typename T> 
class foo 
{ 
public: 
    struct bar 
    { 
        T br;     
    }; 

    struct bar operator[](int); 
private: 
    T * bor; 
}; 

template <typename T> 
typename foo<T>::bar foo<T>::operator[](int x)
{ 
    struct bar brrr;
    
    return brrr; 
} 

Автор: trupca 13.8.2013, 11:57
спасибо это помогло. если не затруднит вы не могли объяснить смысл данной синтаксической конструкции? почему нужно писать именно так?

Автор: NoviceF 13.8.2013, 14:24
Цитата(trupca @  13.8.2013,  12:57 Найти цитируемый пост)
почему нужно писать именно так? 


обычно, чтобы рассудить 2 компилятора, нужно лезть в стандарт, а это, как правило, дело не благодарное.

Вообще, насколько я понимаю, возможность употребления слова struct при объявлении переменных (и типов возвращаемых значений) сохраняется только для совместимости с Си, и в плюсах им никто не пользуется.

Что касается данного случая, то мой опыт общения с шаблонами говорит, что конструкция 

Код

typename foo<T>::bar


является правильной и корретной, т.к. без слова typename компилятор не должен понимать, что такое bar, ведь вполне может быть, что у какого-то типа определена константа с таким именем. typename как раз и призван указать компилятору, что речь идёт о типе.

Кстати, gcc допускает и использование слова class:

Код

#include <iostream>

using namespace std;

template <typename T>
class foo {
public:
    struct bar {
        T br;
    };

    bar operator[](int);
private:
    T * bor;
};

template <typename T>
class foo<T>::bar foo<T>::operator[](int x) {
    struct bar brrr;

    return brrr;
}

template class foo<int>;

int main()
{

    return 0;
}


выглядит это странно и похоже на какую-то вольность со стороны gcc.

Автор: trupca 13.8.2013, 16:19
понятно. спасибо большое. ну а что до gcc то за его вольности я его и люблю ))

Автор: NoviceF 13.8.2013, 17:17
Цитата(trupca @  13.8.2013,  17:19 Найти цитируемый пост)
понятно. спасибо большое.


подожди ещё.. сейчас может кто из авторитетных товарищей отпишется, тогда, возможно, всё прояснится smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)