メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

AUTOSAR C++14 Rule A14-7-2

Template specialization shall be declared in the same file (1) as the primary template (2) as a user-defined type, for which the specialization is declared

説明

ルール定義

Template specialization shall be declared in the same file (1) as the primary template (2) as a user-defined type, for which the specialization is declared.

根拠

このルールに従えば、動作が定義されていない状況が回避されます。たとえば、コンパイラがテンプレートをインスタンス化した "後で" テンプレートの部分的な特殊化を検出した場合、動作は定義されません。テンプレートと同じファイルでテンプレートを特殊化した場合は、この状況が起きる可能性が低くなります。

テンプレートとその特殊化が同じファイルの同じ翻訳単位に含まれているため、特殊化によってコンパイル時のインターフェイスを簡単に拡張することもできます。同じ理由が、テンプレートの特殊化をテンプレートが特殊化される型と同じ型のファイルで行う必要があるという要件にも当てはまります。

Polyspace 実装

チェッカーは、各テンプレートの特殊化をチェックして、以下の場合に違反を報告します。

  • 特殊化が、特殊化されたテンプレートと同じファイル内で行われていない。

  • 特殊化が、テンプレートが特殊化されたユーザー定義の型が定義されたのと同じファイル内で行われていない。

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

  • node_placements.h

    #ifndef NODE_PLACEMENTS_H 
    #define NODE_PLACEMENTS_H 
    #include <iostream> 
    struct placed_node 
    { 
        double x_coordinate; 
        double y_coordinate; 
    }; 
    
    template <typename T> 
    struct node_position 
    { 
        T place; 
        void set_pos (T val) { 
    
            place = val; 
        } 
            void output () { 
            std::cout << "The given data type is not a valid placement.\n"; 
        } 
    }; 
     
    
    template<> 
    struct node_position<placed_node> //Compliant 
    { 
        placed_node place; 
        void set_pos (placed_node val) { 
            place = val; 
        } 
        void output () { 
            std::cout << "The position of the node is at x = " << place.x_coordinate 
            << " and y = " << place.y_coordinate << '\n'; 
        } 
    }; 
    
     
    template <typename T, typename U> 
    struct node_distance 
    { 
        T node_1; 
        U node_2; 
        void output_distance () { 
    
            std::cout << "Inputs are not valid nodes\n"; 
        } 
    }; 
    
    
    #endif 
  • node_distance.cpp

    #include "node_placements.h" 
    #include <math.h>
    
    template<> 
    struct node_position<char> //Noncompliant (1) 
    { 
        char place; 
        void set_pos (char val) { 
        place = val; 
        } 
        void output () { 
        std::cout << "Please input a numerical value with the 'placed_node' type\n"; 
        } 
    }; 
    
    template<> 
    struct node_distance<placed_node, placed_node> //Noncompliant (2) 
    { 
        placed_node node_1; 
        placed_node node_2; 
        double dist; 
        void calc_dist () { 
            double x_diff = abs(node_2.x_coordinate - node_1.x_coordinate); 
            double y_diff = abs(node_2.y_coordinate - node_1.y_coordinate); 
            dist = sqrt(pow(x_diff,2.0) + pow(y_diff,2.0)); 
        } 
    	
            void output () { 
            std::cout << "The distance between the nodes is " << dist << '\n'; 
        } 
    }; 
    
     
    int main () { 
    
        node_position<int> first_pos; 
        first_pos.set_pos(3); 
        first_pos.output(); 
        placed_node node_1 = {3.5,6.5}; 
        node_position<placed_node> second_pos; 
        second_pos.set_pos(node_1); 
        second_pos.output(); 
        placed_node node_2 = {10.0, -7.3}; 
        node_distance<placed_node,placed_node> distance_measure = {node_1, node_2}; 
        distance_measure.calc_dist(); 
        distance_measure.output(); 
    } 

この例では以下のようになります。

  • 基底テンプレート node_position node_placements.h 内で宣言します。しかし、テンプレートの char 型の特殊化は node_distance.cpp 内で宣言されています。Polyspace は、このルールの違反を報告します。

  • node_distance.cpp 内で、ユーザー定義の placed_node 型に対してテンプレート node_distance を特殊化します。しかし、ユーザー定義の placed_node 型は node_placements.h 内で定義されています。Polyspace は、このルールの違反を報告します。

  • 基底テンプレート node_position の宣言と placed_node 型に対するこのテンプレートの特殊化を同じ node_placements.h ファイル内で行います。Polyspace は、違反を報告しません。

チェック情報

グループ: テンプレート
カテゴリ: Required、Automated

バージョン履歴

R2020a で導入