2017-12-28 82 views
3

私はこのプログラムを持っているとします。このプログラムでは、特殊なタイプのものがたくさんあり、一般的なタイプはありません。私がコンパイルすると、"Error: Z"の代わりに"Error: Int"が得られます。私はtypeof(Z)を試しましたが、それは何も得られませんでした - これに標準的なトリックがありますか?タイプ名をstatic_assertエラーにするにはどうすればよいですか?

template<class Z> 
Z derp() 
{ 
    static_assert(false, "Error: Z"); 
} 

template <> 
double derp<double>() 
{ 
    return 5; 
} 


int main() 
{ 
    double b = derp<double>(); 
    int r = derp<int>(); 
    return 0; 
} 

答えて

3

厳密に言えば、あなたのプログラムは[temp.res]/8に違反している静的な主張のために必要な一切の診断を悪い形成されていません。しかし、それは簡単に修正可能です。削除されたとして私達はちょうど主要なテンプレートを定義することができます

template<class Z> 
Z derp() = delete; 

template<> 
double derp<double>() 
{ 
    return 5; 
} 


int main() 
{ 
    double b = derp<double>(); 
    int r = derp<int>(); 
    return 0; 
} 

今すぐプログラムがうまく形成され、主な専門分野が実際に呼び出されていない限り。ほとんどのコンパイラは、あなたが望むエラーメッセージも出すでしょう。ここではClang 5.0:

prog.cc:14:13: error: call to deleted function 'derp' 
    int r = derp<int>(); 
      ^~~~~~~~~ 
prog.cc:2:3: note: candidate function [with Z = int] has been explicitly deleted 
Z derp() = delete; 
^
関連する問題