エラー ...に対して減少できません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dom

エラー ...に対して減少できません

#1

投稿記事 by dom » 12年前

下記のコードをコンパイルすると「テンプレート 引数を 'Num1' に対して減少できませんでした」
というエラーが出ます。
func0とfunc1の引数の型は同じだと思うのですが、func0がエラーとなるのはなぜなのでしょうか?

コード:

#include <iostream>
using namespace std;
 
template <int Num0, int Num1, class T>
class A
{
public:
    A() : num0(Num0), num1(Num1), val(T(1)/T(2))
    {}
 
    int num0;
    int num1;
    T val;
};
 
class Hoge
{
public:
    enum { N = 3 };
 
        // このクラスではT=double版のAをつかうのでラップする
    template <int Num0, int Num1>
    struct AType{
        typedef A<Num0, Num1, double> Type;
    };
 
    template <int Num1>
    void func0(const typename AType<N, Num1>::Type& a)   // コンパイルエラー
    {
        cout << a.num0 << endl;
        cout << a.num1 << endl;
        cout << a.val << endl;
    }
 
    template <int Num1>
    void func1(const A<N, Num1, double>& a)   // わざわざdoubleを書きたくないが現状の回避策
    {
        cout << a.num0 << endl;
        cout << a.num1 << endl;
        cout << a.val << endl;
    }
};
 
 
int main()
{
    A<Hoge::N, 7, double> a;
    Hoge hoge;
 
    //hoge.func0(a); // コメントを外すとfunc0のコンパイルエラー
    hoge.func1(a);
 
    return 0;
}

vs++2008, 2010

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: エラー ...に対して減少できません

#2

投稿記事 by h2so5 » 12年前

func0とfunc1の引数の型は確かに同じですが、コンパイラにはそれが判断できません。
AType<int Num0, int Num1> から AType::Type を計算するのは簡単ですが、
A<Hoge::N, 7, double>からATypeのテンプレート引数を逆算するのは(プログラマにはできてもコンパイラには)困難です。

コード:

hoge.func0<7>(a);
というようにテンプレート引数を明示してやれば呼び出すことができます。

関連リンク:
http://stackoverflow.com/questions/1264 ... r-deducing

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: エラー ...に対して減少できません

#3

投稿記事 by YuO » 12年前

関数テンプレートの推論規則に,template-name<T>::typeというものはありません。
故に,typename AType<N, Numb1>::Typeを推論することはありません。
規格 (INCITS/ISO/IEC 14882-2012) 14.8.2.5 Deducing template arguments from a typeの¶8に挙げられている規則は,以下の通りです。
ただし,Tはテンプレートの型引数,TTはテンプレートのテンプレート引数,iはテンプレートの非型引数です。
  • T
  • cv-list T
  • T*
  • T&
  • T&&
  • T[integer-constant ]
  • template-name <T> (where template-name refers to a class template)
  • type (T)
  • T()
  • T(T)
  • T type ::*
  • type T::*
  • T T::*
  • T (type ::*)()
  • type (T::*)()
  • type (type ::*)(T)
  • type (T::*)(T)
  • T (type ::*)(T)
  • T (T::*)()
  • T (T::*)(T)
  • type [i]
  • template-name <i> (where template-name refers to a class template)
  • TT<T>
  • TT<i>
  • TT<>
A<N, Num1, double>であれば,template-name <T>の推論規則があるため,テンプレートを解決できます。

dom

Re: エラー ...に対して減少できません

#4

投稿記事 by dom » 12年前

ありがとうございます。原因がわかってすっきりしました。
推論規則などテンプレートについてもっと勉強したいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る