概要奇妙なエラーがC2275 ...ラムダ関数を呼び出すメンバ関数テンプレートとラムダ何らかの理由
、私のメンバ関数テンプレートを使用して表現として、この種の不正使用はエラーC2275とコンパイルに失敗します...この型を式として不正に使用しますが、関数を自由な関数に移動して正しくコンパイルすると、
詳細
まず私はvector
でfunction
のインスタンスを保持し、基本クラスを持っています。派生したクラスのみがadd_external
を呼び出してvector
にfunction
のインスタンスを追加できます。すべてのfunction
インスタンスは、invoke_externals
を呼び出すことによって公的に呼び出すことができます。派生クラスは、lambdaをfunction
インスタンスとして追加します。これらのラムダは、基底クラス関数テンプレートinvoke_internal
を別の「内側の」ラムダと呼びます。 invoke_internal
にテンプレートパラメータinvoke_internal
に「内側」ラムダを実行するときに、明示的にキャッチされる例外タイプされています。そして、私はlogic_error
とruntime_error
例外をスロー2つのささいな無料の機能を持っている
using namespace std;
class base
{
public:
void invoke_externals()
{
for (auto it = funcs_.begin(); it != funcs_.end(); ++it)
{
(*it)();
}
}
protected:
void add_external(function<void(void)> func)
{
funcs_.push_back(func);
}
template <typename T>
void invoke_internal(function<void(void)> func)
{
try
{
func();
}
catch (const T&){}
catch (...){}
}
vector<function<void(void)>> funcs_;
};
。これらの関数は、invoke_internal
で呼び出され、「内側」ラムダで使用される:derived
クラスのコンストラクタにおいて
void throws_logic_error()
{
throw logic_error("");
}
void throws_runtime_error()
{
throw runtime_error("");
}
二ラムダはadd_external
で添加されます。これらのラムダのそれぞれは、invoke_internal
に "内側"のlmbdasと呼ばれています。 invoke_internal
への最初の呼び出しは、throws_logic_error
がスローするlogic_error
を明示的にキャッチします。 invoke_internal
への2回目の呼び出しでは、throws_runtime_error
が投げるruntime_error
を明示的にキャッチします。
class derived : public base
{
public:
derived()
{
add_external([this]()
{
invoke_internal<logic_error>([]()
{
throws_logic_error();
});
});
add_external([this]()
{
invoke_internal<runtime_error>([]()
{
throws_runtime_error();
});
});
}
};
一緒全てを結びつけるために、derived
がインスタンス化され、invoke_externals
はderived
コンストラクタで添加「外部」ラムダを呼び出すために呼び出されます。これらの「外部」ラムダは順番に「内側」ラムダを起動するとスローされた例外を明示的にキャッチされます。
しかし
int wmain(int, wchar_t*[])
{
derived().invoke_externals();
return 0;
}
問題、上記ではコンパイルできません:
error C2275: 'std::logic_error' : illegal use of this type as an expression
error C2275: 'std::runtime_error' : illegal use of this type as an expression
... コンストラクタのinvoke_internal
へのコールに対して発行されます。
invoke_internal
をbase
から外に出して自由にすると、コンパイルされます。
質問
なぜ私が表現関数テンプレートがbase
メンバーであるとして、このタイプのエラーC2275 ...不正使用を入手できますか?
注:私の本当の人生のシナリオで機能が実際にさまざまな方法でそのクラスの状態を使用しないのでがbase
のうち、問題のある機能を移動するには最適ではありません。
良い考え。ありがとう - これは便利かもしれない – sehe