コンパイラ・パーソナリティに関するFAQ
(GUI上でパーソナリティ・ファイルの内容を参照・編集する方法はこちらをご参照ください。)
質問1. 「依存基底クラスのルックアップ(-sdep+)」オプションの設定基準を教えてください。 全バージョン 戻る
回答1. コンパイラの中には、識別子の名前検索(ルックアップ)の範囲をクラス・テンプレートの基底クラスにまで拡張するものと、そうでないものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「依存基底クラスのルックアップ(-sdep+)」オプション を設定する必要があります。後者の場合は、デフォルト(-sdep-)のままにします。

具体的には、お使いのコンパイラが次の ソースコードを エラーなくコンパイルできる場合は、-sdep+オプションを設定する必要があります。
  // Error ==> -sdep-  (default)
  // Success ==> -sdep+
  template<typename T> struct U {
    typedef int result_type;
  };
  
  template<typename T> class B : public U<T> { 
    result_type fn(); // Problem
  };
  
  int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
[コンパイラ パーソナリティ][拡張] タブで
[依存基底クラスのルックアップ]
チェックボックスを選択します。

設定ファイルを直接編集する場合:
-sdep+ と記述します。
質問2. 「テンプレート・パラメータを反映(-ptp+)」オプションの設定基準を教えてください。 全バージョン 戻る
回答2. コンパイラの中には、テンプレートの特殊化時に、その定義内で特殊化元テンプレート定義のテンプレート・パラメータ名を伝播して利用できるものと、そうでないものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「テンプレート・パラメータを反映(-ptp+)」オプション を設定する必要があります。後者の場合は、デフォルト(-ptp-)のままにします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-ptp+オプションを設定する必要があります。
  // Error ==> -ptp-  (default)
  // Success ==> -ptp+
  template <class T> class C {
  };
  
  template <> class C<int> {
    T I; // Problem
  };
  
  int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
[コンパイラ パーソナリティ][拡張] タブで
[テンプレート・パラメータを反映]
チェックボックスを選択します。

設定ファイルを直接編集する場合:
-ptp+ と記述します。
質問3. 「関数テンプレート・ボディの解釈を遅らせる(-dpft+)」オプションの設定基準を教えてください。 全バージョン 戻る
回答3. コンパイラの中には、関数テンプレートの構文解析をテンプレートの インスタンスが作成される時点まで遅らせているものと、そうでない ものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「関数テンプレート・ボディの解釈を遅らせる(-dpft+)」オプション を設定する必要があります。後者の場合は、デフォルト(-dpft-)のまま にします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-dpft+オプションを設定する必要があります。
  // Error ==> -dpft-  (default)
  // Success ==> -dpft+
  class C {
  public:
    template <class T> void foo(){
      u8 my_u8;
    }
  };
    
  typedef unsigned int u8;
  void bar()
  {
    C c;
    c.foo<int>(); // Problem
  }
  
  int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
[コンパイラ パーソナリティ][拡張] タブで
[関数テンプレート・ボディの解釈を遅らせる]
チェックボックスを選択します。

設定ファイルを直接編集する場合:
-dpft+ と記述します。
質問4. 「friend名を導く(-ifn+)」オプションの設定基準を教えてください。 全バージョン 戻る
回答4. コンパイラの中には、friend宣言を前方宣言と同様に扱い、friend宣言で使用された識別子を名前検索時に使用できる ようにしているものと、そうでないものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「friend名を導く(-ifn+)」オプション を設定する必要があります。後者の場合は、デフォルト(-ifn-)のまま にします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-ifn+オプションを設定する必要があります。
  // Error ==> -ifn-  (default)
  // Success ==> -ifn+
  class C {
    friend void foo();
  };
  
  void bar() {
    foo(); // Problem
  }
  
  void foo() {}
  
  int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
[コンパイラ パーソナリティ][拡張] タブで
[friend名を導く]
チェックボックスを選択します。

設定ファイルを直接編集する場合:
-ifn+ と記述します。
質問5. 「推定型が const/volatile 付きで異なる場合でもテンプレート引数の推定を成功とする(-accd+)」オプションの設定基準を教えてください。 QAC++2.1J以上 戻る
回答5. コンパイラの中には、適合するテンプレートを推定する際に、テンプレート引数の型が const または voltile 修飾子の有無のみで異なる場合でも推定成功とするものと、そうでない ものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「推定型が const/volatile 付きで異なる場合でも テンプレート引数の推定を成功とする(-accd+)」オプション を設定する必要があります。後者の場合は、デフォルト(-accd-)のまま にします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-accd+オプションを設定する必要があります。
  // Error ==> -accd-  (default)
  // Success ==> -accd+
  template <typename T>
  void foo(T&, T&) {}
  
  void bar() {
    int i;
    const int j = 0;
  
    foo(j, i); // Problem
  }
  
  int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
[コンパイラ パーソナリティ][拡張] タブで
[推定型が const/volatile 付きで異なる場合でもテンプレート引数の推定を成功とする]
チェックボックスを選択します。

設定ファイルを直接編集する場合:
-accd+ と記述します。
質問6. 「一時オブジェクトの非 const 参照への結合を許可する(-atncrb+)」オプションの設定基準を教えてください。 QAC++2.1J以上 戻る
回答6. コンパイラの中には、一時オブジェクトを const 参照でない型に受け渡せるものと、そうでないものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「一時オブジェクトの非 const 参照への結合を許可する(-atncrb+)」オプション を設定する必要があります。後者の場合は、デフォルト(-atncrb-)のまま にします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-atncrb+オプションを設定する必要があります。
  // Error ==> -atncrb-  (default)
  // Success ==> -atncrb+
  class C {};
  
  void foo(C&) {}
  
  void boo()
  {
    foo(C()); // Problem
  }
  
  int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
[コンパイラ パーソナリティ][拡張] タブで
[一時オブジェクトの非 const 参照への結合を許可する]
チェックボックスを選択します。

設定ファイルを直接編集する場合:
-atncrb+ と記述します。
質問7. 「std 名前空間をグローバル・スコープの別名として扱う(-sig+)」オプションの設定基準を教えてください。 QAC++2.1J以上 戻る
回答7. コンパイラの中には、std 名前空間内で宣言された識別子をグローバル・スコープ内で宣言された識別子のように扱う(逆も同様です)ものと、そうでないもの があります。

お使いのコンパイラが、前者の挙動をする場合は、 「std 名前空間をグローバル・スコープの別名として扱う(-sig+)」オプション を設定する必要があります。後者の場合は、デフォルト(-sig-)のままにします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-sig+オプションを設定する必要があります。
  // Error ==> -sig-  (default)
  // Success ==> -sig+
  #include <string>
  
  std::string s1("hello");
  string s2("world"); // Problem
  
  int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
[コンパイラ パーソナリティ][拡張] タブで
[std 名前空間をグローバル・スコープの別名として扱う]
チェックボックスを選択します。

設定ファイルを直接編集する場合:
-sig+ と記述します。
質問8. 「非 C99 リテラル拡張ルールを使う(-duc99dilt+)」オプションの設定基準を教えてください。 QAC++2.1J以上 戻る
回答8. コンパイラの中には、C99言語規格に従って、LONG_MAXよりも大きな10進定数を long long 型として扱うものと、既存のC++言語規格に従って unsigned long long 型として扱うものがあります。

お使いのコンパイラが、後者の挙動をする場合は、 「非 C99 リテラル拡張ルールを使う(-duc99dilt+)」オプションをオフ(-duc99dilt-)に設定する必要があります。 前者の場合は、デフォルト(-duc99dilt+)のままにします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-duc99dilt-オプションを設定する必要があります。
  // Error ==> -duc99dilt+  (default)
  // Success ==> -duc99dilt-
  void foo(int i) {}
  void foo(unsigned long i) {}
  
  void bar(void) {
    foo(4294967295); // Problem
  }
  
  int main(void) { return 0; }
なお、設定方法は次の通りです。

[コンパイラ パーソナリティ][拡張] タブで
[非 C99 リテラル拡張ルールを使う]
チェックボックスを非選択にします。

設定ファイルを直接編集する場合:
-duc99dilt- と記述します。
質問9. 「常に直接初期化を使用する(-audi+)」オプションの設定基準を教えてください。 QAC++2.1J以上 戻る
回答9. コンパイラの中には、'T x = e;'という形式でクラスを宣言した場合に、'T x(e);' と記述されたものと見なして初期化するものと、'T x; x = e;' と記述されたものと見なして初期化するものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「常に直接初期化を使用する(-audi+)」オプション を設定する必要があります。後者の場合は、デフォルト(-audi-)のままにします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-audi+オプションを設定する必要があります。
  // Error ==> -audi-  (default)
  // Success ==> -audi+
  class A{};
  
  class B {
  public:
    B(const A&) {}
  };
  
  class C {
  public:
    C(const B&) {}
  };
  
  void foo() {
    A c1;
    C c2 = c1; // Problem
  }
  
  int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
[コンパイラ パーソナリティ][拡張] タブで
[常に直接初期化を使用する]
チェックボックスを選択します。

設定ファイルを直接編集する場合:
-audi+ と記述します。
質問10. 「メンバからメンバ・ポインタへの暗黙の型変換を許可する(-aicpm+)」オプションの設定基準を教えてください。 QAC++2.1J以上 戻る
回答10. コンパイラの中には、クラスのメンバ関数型から クラスのメンバ・ポインタ型への変換を許すものと、そうでないものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「メンバからメンバ・ポインタへの暗黙の型変換を許可する(-aicpm+)」オプション を設定する必要があります。後者の場合は、デフォルト(-aicpm-)のままにします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-aicpm+オプションを設定する必要があります。
  // Error ==> -aicpm-  (default)
  // Success ==> -aicpm+
  class X {
  public:
    void foo() {}
  };
  
  void (X::*func)() = X::foo; // Problem
  
  int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
[コンパイラ パーソナリティ][拡張] タブで
[メンバからメンバ・ポインタへの暗黙の型変換を許可する]
チェックボックスを選択します。

設定ファイルを直接編集する場合:
-aicpm+ と記述します。
質問11. 「非型実引数に対するヌルポインタ変換を許可する(-atanpc+)」オプションの設定基準を教えてください。 QAC++2.1J以上 戻る
回答11. コンパイラの中には、ヌルポインタをポインタ型の非型テンプレート仮引数に実引数として渡せるものと、そうでないものがあります。

お使いのコンパイラが、前者の挙動をする場合は、 「非型実引数に対するヌルポインタ変換を許可する(-atanpc+)」オプション を設定する必要があります。後者の場合は、デフォルト(-atanpc-)のままにします。

具体的には、お使いのコンパイラが次のソースコードをエラーなく コンパイルできる場合は、-atanpc+オプションを設定する必要があります。
  // Error ==> -atanpc-  (default)
  // Success ==> -atanpc+
  template <void *>
  class C {};
  
  void foo(void)
  {
    C<0> c; // Problem
  }
  
  int main(void) { return 0; }
なお、設定方法は次の通りです。

GUIから設定する場合:
[コンパイラ パーソナリティ][拡張] タブで
[非型実引数に対するヌルポインタ変換を許可する]
チェックボックスを選択します。

設定ファイルを直接編集する場合:
-atanpc+ と記述します。