LINUX.ORG.RU

Проблема с областью видимости при использование шаблонов

 ,


0

2

Есть код:

template<class T>
class test1
{
	public:
		test1()
		{

		}

	protected:
		T a;
};

template <class T>
class test2: public test1<T>
{
	test2(T const &tmp){
		a = tmp;
	}
};

int main(int argc, char **argv)
{

}

Выдает:

Invoking: GCC C++ Compiler
g++ -D__GXX_EXPERIMENTAL_CXX0X__ -D_GLIBCXX_USE_C99 -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/main.d" -MT"src/main.d" -o "src/main.o" "../src/main.cpp"
../src/main.cpp: In constructor «test2<T>::test2(const T&)»:
../src/main.cpp:25:3: ошибка: нет декларации «a» в этой области видимости

А так все ок:

template<class T>
class test1
{
	public:
		test1()
		{

		}

	protected:
		T a;
};

class test2: public test1<int>
{
	test2(int const &tmp){
		a = tmp;
	}
};

int main(int argc, char **argv)
{

}

Invoking: GCC C++ Compiler
g++ -D__GXX_EXPERIMENTAL_CXX0X__ -D_GLIBCXX_USE_C99 -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/main.d" -MT"src/main.d" -o "src/main.o" "../src/main.cpp"
Finished building: ../src/main.cpp

Почему так происходит?
Как использовать переменную 'a' в шаблоне?
Спасибо.

★★★★★
Ответ на: комментарий от deterok

Почему именно так?

потому-что в общем случае в результате разворачивания шаблона 'a' может оказаться чем угодно, тебя заставляют явно указать откуда ты ее будешь брать, чтоб не было потом проблем

wota ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.