объясните, это бага 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" выбрал неправильную, так получается?
Здравствуйте, 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();
}
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 YegorushkinPosted via RSDN NNTP Server 1.9 gamma