我試圖聲明一個類「Lambdas」,它將lambdas(及其類型信息)提供給另一個類「Test」。 Lambdas還在「lambda」中持有「this」對具體Test實例的引用,以便訪問Test公共成員。 我這樣做是爲了一旦定義lambda表達式,然後通過decltype其他地方推斷類型() 但我得到的錯誤:成員訪問不完全類型:如何訪問模板參數的成員? 「成員訪問不完整類型」
template <typename T>
struct LambdasInstances {
T * self;
explicit LambdasInstances(T * p) : self(p) {} // CAPTURE Test "this"
auto genLambda1() {
return [=](int x){
self->testVar; // ERROR: Member access to incomplete type
};
}
};
class Test3 {
public:
LambdasInstances<Test3> instances;
int testVar;
Test3() : instances(this) {}
decltype(instances.genLambda1()) varLambda = instances.genLambda1();
void useLambda() { varLambda(123); }
};
,但如果我會讓genLambda()外部定義,然後我就跑到另外一個問題 - 錯誤:genLambda()的推導式前不能使用其定義!:
template <typename T>
struct LambdasInstances {
T * self;
explicit LambdasInstances(T * p) : self(p) {}
auto genLambda1(); // would be defined after Test3 declaration
};
class Test3 {
public:
int testVar;
LambdasInstances<Test3> instances;
Test3() : instances(this) {}
decltype(instances.genLambda1()) varLambda = instances.genLambda1();
};
// IF WE DEFINE AFTER ::^genLambda() with deduced type cannot be used before its defined!
template< typename T>
auto LambdasInstances<T>::genLambda1() {
return [=](int x){
self->testVar;
};
}
你真的需要'實例'成員嗎?鑑於你也有返回的lambda作爲成員。 –
@DanielJour'instances'成員在這裏將Test3的'this'封裝在'LambdasInstances'裏面。我不知道我怎麼能把這個'注入'我的lambda。根據'varLambda'是成員,因爲我想稍後使用'Test3'作爲狀態機,所以如果這有助於(甚至是有效的),我需要一個類可見的名稱來引用'currentState = varLambda;' – barney
Idk,但顯然這是有效的:http://coliru.stacked-crooked。com/a/b63cbf45576c4bf4 –