MISRA C++:2008 Rule 14-6-1

В шаблоне класса с зависимой основой любое имя, которое может быть найдено в той зависимой основе, должно быть отнесено в использование квалифицированного ID или этого->

Описание

Управляйте определением

В шаблоне класса с зависимой основой любое имя, которое может быть найдено в той зависимой основе, должно быть отнесено в использование квалифицированного ID или этого->

Объяснение

Когда шаблон класса выводит из другого шаблона класса, может быть беспорядок, являющийся результатом использования имен, которые существуют и в основном шаблоне и в текущем осциллографе или пространстве имен. Когда то же имя существует в шаблоне базового класса и namespcae, который содержит классы, разрешение осциллографа этих имен зависит от компилятора, который может противоречить ожиданию разработчика. Чтобы избежать беспорядка, используйте полностью определенный ID или this-> явным образом снять неоднозначность намеченного объекта, когда такой конфликт по совпадению имен существует.

Реализация Polyspace

Polyspace® флаги называют, для которого все эти условия верны:

  • Имя существует в базовом классе.

  • Имя существует в пространстве имен, которое содержит базовый класс.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

развернуть все

typedef signed   int          int32_t;
namespace NS0{
	typedef int32_t TYPE;

	void bar( );
	namespace NS1{
		namespace NS{
			
			template <typename T>
			class Base;
			template <typename T>
			class Derived : public Base<T>
			{
				void foo ( )
				{
					TYPE t = 0;                           // Noncompliant
					bar ( );                                // Noncompliant
				}
				void foo2 ( )
				{
					NS0::TYPE t1 = 0;                      // Compliant
					NS0::bar ( );                            // Compliant
					typename Base<T>::TYPE t2 = 0; // Compliant
					this->bar ( );                // Compliant
				}
			};
			template <typename T>
			class Base
			{
			public:
				typedef T TYPE;
				void bar ( );
			};
			template class Derived<int32_t>;
		}
	}
}

В этом примере, имена Type и bar заданы оба в пространстве имен NS0 и в рамках шаблона класса Base. Шаблон класса Derived выводит из Base. В Derived::foo1(), эти имена используются, не используя полностью определенные имена или this->. Это не ясно ли TYPE в Base::foo1 твердость к NS0::TYPE или Base::TYPE. Вы можете получить различные результаты в зависимости от реализации компилятора. Polyspace отмечает эти неоднозначные выражения.

В Derived::foo2()Ввод и bar вызываются при помощи их полностью определенного имени или this->. При помощи полностью определенных имен или this->, неоднозначность в разрешении осциллографа исключена. Polyspace не отмечает это использование.

Проверяйте информацию

Группа: шаблоны
Категория: необходимый
Введенный в R2013b