Това, което прочетох в стандарта C++ за имена на инжектирани класове, противоречи (както го виждам) с поведението на примерна програма, която ще представя скоро. Ето какво прочетох:
- #P2#
#P3#
- #P4#
#P5#
От тях разбирам, че следното е добре оформена единица за превод и се компилира успешно.
#include <vector>
class X: std::vector<int>
{
vector mem;
};
Въпреки това бих предположил, че следното трябва да доведе до грешка, но не е така
#include <vector>
class X: std::vector<int>, std::vector<char>
{
vector mem; //compiles OK... mem is apparently std::vector<int>
};
Тъй като името vector
се инжектира както в std::vector<int>
, така и в std::vector<char>
като име на публичен член, то трябва да бъде наследено от X и следователно името vector
в X
трябва да е двусмислено. Изпускам ли нещо?
P.S. Използвам MSVC9.0
X
във вашия пример? т.е. дали името на инжектиран-клас не еX
, а неvector
? Мисля, че случаят е такъв и ако е така, кавичките са без значение за кода, но въпреки това поведението на този компилатор не изглежда правилно или няма причина да се предпочитаstd::vector<int>
предstd::vector<char>
и това означава, че трябва да има неяснота грешка се задейства. - person David Rodríguez - dribeas   schedule 11.08.2011X
да, ноvector
се инжектира като публично име и в двете бази... Така че трябва да е видимо (и двусмислено) и вътре вX
- както в първия пример - person Armen Tsirunyan   schedule 11.08.2011std::vector
, Име на клас се вмъква в обхвата, в който е деклариран, веднага след като се види името на класа.: std namespace; Името на класа също се вмъква в обхвата на самия клас; това е известно като injected-class-name.: std::vector шаблон. Все още мисля, че тези цитати не са свързани с конкретния примерен код. - person David Rodríguez - dribeas   schedule 11.08.2011