2017-09-11 11 views
3

私はクラスの各インスタンスの関数テンプレートを特化しようとする次のコード(それが誘導されていてもよい)を有する:テンプレートパラメータとして基本クラスへの参照を渡す

class Base { 
}; 

class Derived:public Base { 
}; 

template<Base& b> 
void myfunction() { 
    //use b somehow 
} 

Derived myobject; 

int main() { 
    myfunction<myobject>(); //this does not work 
} 

コード結果を私は、静的与えられ、タイプBaseの静的インスタンスへの参照を渡すにはどうすればよい

candidate template ignored: invalid explicitly-specified argument for template parameter 'b' 

[live demo]

:エラーメッセージでオブジェクトmyobject

+1

'void main()' ?? – WhiZTiM

+1

これで解決したい*実際の問題は何ですか?なぜあなたはこれをやっている? [XY問題](http://xyproblem.info/)を読んで、あなたの質問にどのように当てはまるか(未知の問題の解決策を尋ねる)を反映してください。 –

+0

あなたのテンプレートはです - あなたの関数の引数はT & b;であり、あなたの呼び出しはmyFunc(myobj) です。それは基本的にテンプレートの誤解があるようですので、あなたの本を再訪するべきだと思いますその上に – UKMonkey

答えて

4

[temp.param]/4に係る基準としてテンプレート非型パラメータを宣言する結構です中:

非型テンプレートパラメータは、以下 (任意にCVのいずれかを有するもの-qualified)タイプ:

  • ...
  • 左辺参照オブジェクトまたは関数への左辺値参照する、
  • ...

引数[temp.arg.nontype]/2に制限に従う必要があります。

を非型テンプレートパラメータのテンプレート引数は 変換定数式でなければなりませんテンプレートパラメータのタイプの 参照またはポインタ型の非型テンプレートパラメータは、定数式の 値がを参照してはならない(またはポインタ タイプのためのアドレスであってはならない):

  • 明示的にあなたがやろうとしているもの禁じサブオブジェクト
  • ...

bは、サブオブジェクトを参照することになります。

このコンパイルを行います唯一の解決策は、別の過負荷を加えている。

template<Derived & d> 
void myfunction() 
{ 
    //use d somehow 
} 

ですから、何とか、共通のコードを抽出する必要があります。

それとも、あなたが持っている場合はC++利用できる17:

template<auto& b, std::enable_if_t< 
        std::is_base_of_v<Base, std::decay_t<decltype(b)>> 
        , void*> = nullptr> 
void myfunction() 
{ 
    //use b somehow 
} 

私はあなたがしかし、あなたの一般的なアプローチを再考示唆しています。

+0

'd'の型はどちらかの方法でコンパイル時に知る必要があります。最も洗練された解決策はあなたが提案したものです、あるいは' template 'のような追加の型を追加することですコンパイラの要求を満たす... –

関連する問題