AUTOSAR C++14 Rule A14-7-1

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

Описание

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

Тип, используемый в качестве аргумента шаблона, должен предоставить всем членам, которые используются шаблоном.

Объяснение

Шаблон может задать операции на типовом типе через одну или несколько переменных члена или функций членства. Если тип, который вы используете, чтобы инстанцировать шаблона, не предоставляет всем членам, которые использует шаблон, ваша программа может быть плохо сформирована и может содержать синтаксис или семантические ошибки.

Например, в следующем коде, шаблоне TmplClass объявляет функцию членства someProperty() но введите myType не делает. Инстанцирование TmplClass при помощи myType несовместимо и, в результате недостающего someProperty() функция, inst.func(); вызывает ошибку компиляции.

template <typename T>
class TmplClass
{
public:
    void func()
    {
        T t;
        t.someProperty();
    }
};
struct myType {
};

void Instance() noexcept
{
    TmplClass<myType> inst; //Non-compliant
// inst.func(); //compilation error, struct myType has no member function someProperty()
}

Реализация Polyspace

  • Polyspace® флаги classStruct (), или union обработайте инстанцирования по шаблону, когда параметр шаблона не содержит все члены, которые использует шаблон.

    Если вы рассматриваете результаты в рабочем столе Polyspace или веб-интерфейсах в определении шаблона, программное обеспечение подсвечивает члены, которые отсутствуют в параметре шаблона.

  • Polyspace не отмечает:

    • Инстанцирования шаблона функции.

    • Обработайте по шаблону инстанцирования, которые используют неполный тип в качестве параметра шаблона.

    • Обработайте по шаблону инстанцирования, которые используют параметр шаблона, где недостающий член является типом элемента (вложенный тип) или шаблон члена.

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

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

Примеры

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

class IncompleteType;
class MyClass
{

    struct MyStruct {
        int Field1;
        int Field2;
    };

    struct MyStructArray {
        int Field3[12];
    };

public:
    MyStruct property1;
    int property2[10];
    MyStruct property3[10];
    MyStructArray property4;


};

template <typename T>
class TemplClass
{
public:
    void fooA()
    {
        T t;

        t.property1 = {1, 2};
        t.property2[5] = 5;
        t.property3[2].Field1 = 6;
        t.property4.Field3[4] = 10;

    }
};

class MyType
{
public:
    int rank;
};

class MyOtherType
{
public:
    int property;
};

template <typename T1, typename T2>
class TemplClass2Param
{
    void func()
    {
        T1 t1;
        T2 t2;
        t1.rank = 5;
        t2.rank2 = 6;
    }
};

void instantiate(void)
{
    TemplClass<MyClass> var; // Compliant
    TemplClass<IncompleteType> varFromIncomplete; // Compliant
    TemplClass2Param<MyType, MyOtherType> otherVar; //Non-compliant

}

В этом примере, первом инстанцировании шаблона TmplCass при помощи параметра шаблона MyClass совместимо потому что MyClass предоставляет всем членам, которые использует шаблон.

Polyspace не отмечает второе инстанцирование TmplCass это использует неполный тип IncompleteType.

Инстанцирование TmplClass2Param несовместимо потому что один из параметров шаблона (MyOtherType) не обеспечивает переменную rank2 члена то, что шаблон использует.

class MyClass
{
  public:
    int var;
    void foo(int);
    typedef int nestedtype; // member type  
    template<typename T>  
    void tmpl_func() { }  //member template
};

template <typename T>
class TmplClass {
  public:
    void func() {
        T t;
        int j = t.var;
        t.foo(j);
        typename T::otherNestedType newvar; //member type not in MyClass   
        newvar = 5;

        t.template other_tmpl_func<int>(); //member template not in MyClass     
    } 
};

void bar (void) {
    TmplClass<MyClass> instance;    // Compliant
}

В этом примере, параметр шаблона MyClass не имеет типа элемента otherNestedType или шаблон other_tmpl_function члена, но инстанцирование TmplClass<MyClass> instance не отмечается.

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

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