имя параметра шаблона
От: ssm Россия  
Дата: 19.10.04 12:02
Оценка:
объясните, это бага VC71 или я не прав?


namespace impl
{
    template<class T>
    class FooT
    {
    public:
        FooT(int i);
    private:
        int i;
    };
}

template<class T, int i>
class FooT : public impl::FooT<T>
{
public:
    //error C2248: 'impl::FooT<T>::i' : cannot access private member declared in class 'impl::FooT<T>
    // : see declaration of 'impl::FooT<T>::i'

    FooT()
        :    impl::FooT<T>(i)
    {
    }
};


int main(int argc, _TCHAR* argv[])
{
    FooT<double, 5> foo;
}


если я переименую имя параметра(i) в шаблоне ::FooT, то ошибки не будет. компилятор получается запутался, и из двух "i" выбрал неправильную, так получается?
Re: ну а вот и бомба
От: ssm Россия  
Дата: 19.10.04 12:15
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>объясните, это бага VC71 или я не прав?


может кто-то результат на другом компе показать?

#include <iostream>

namespace impl
{
    template<class T>
    class FooT
    {
    public:
        FooT(int i)
            :    i(i)
        {
        }

        T get(){return i;}

    protected:
        int i;
    };
}

template<class T, int i>
class FooT : public impl::FooT<T>
{
public:
    FooT()
        :    impl::FooT<T>(i)
    {
    }
};


int main(int argc, _TCHAR* argv[])
{
    FooT<double, 5> foo1;
    FooT<double, 7> foo2;

    //-8.58993e+008 -8.58993e+008Press any key to continue        
    std::cout << foo1.get() << " "<< foo2.get();
}
Re: имя параметра шаблона
От: MaximE Великобритания  
Дата: 19.10.04 12:16
Оценка: 5 (1)
ssm wrote:

> объясните, это бага VC71 или я не прав?

>
>
>
> namespace impl
> {
>     template<class T>
>     class FooT
>     {
>     public:
>         FooT(int i);
>     private:
>         int i;
>     };
> }
>
> template<class T, int i>
> class FooT : public impl::FooT<T>
> {
> public:
>     //error C2248: 'impl::FooT<T>::i' : cannot access private member declared in class 'impl::FooT<T>
>     // : see declaration of 'impl::FooT<T>::i'
>
>     FooT()
>         :    impl::FooT<T>(i)
>     {
>     }
> };
>
>
> int main(int argc, _TCHAR* argv[])
> {
>     FooT<double, 5> foo;
> }
>

>
> если я переименую имя параметра(i) в шаблоне ::FooT, то ошибки не будет. компилятор получается запутался, и из двух "i" выбрал неправильную, так получается?

Это баг MSVC связанный с тем, что компилятор не поддерживает two-phase lookup.

Базовый класс impl::FooT<T> является argument dependent base class, поэтому компилятор при использовании неквалифицированного имени в FooT вообще не должен "заглядывать" в такой базовый класс.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.