2011-01-17 3 views
3
#include "stdafx.h" 
#include <iostream> 
using namespace std; 

template<class Type> 
struct X 
{ 
    void run()const 
    {//Why on earth this doesn't work? 
     [&]() 
     { 
      Type::alloc(); 
     }; 
    } 
    void run_1()const 
    {//if this does 
     Type::alloc(); 
    } 
}; 

struct T 
{ 

    static void alloc() 
    {} 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    X<T> x; 
    x.run_1(); 
    return 0; 
} 

AFAIC lambda는 이름이없는 fnc이므로 AFAIC lambda는 컴파일되지 않고 run_1이하는 이유는 무엇입니까?
VS2010 sp beta1을 사용하십시오.람다 식의 범위

+0

내 생각에, 당신이 그것을 잘라내는 방식으로, 람다 함수는'run()'에 선언되어 있어도 X의 멤버가 아닙니다. 그것은 동봉하는 클래스와 아무 관련이 없습니다. –

+1

VS2010에서 반환 한 컴파일 오류를 알려주십시오. –

+0

오류 C2653 : '유형': 클래스 또는 네임 스페이스 이름이 아닙니다. ' –

답변

2

당신은 람다에 전달해야합니다 : 나는 아주 확실하지 않다 인정해야

void run()const 
    {//Why on earth this doesn't work? 
     auto alloc = Type::alloc; 
     [&]() 
     { 
      alloc(); 
     }; 
    } 
+0

@ Moo-Juice 그래서 람다에 대해 "그들"이 람다가 이름없는 것을 제외하고는 fnc와 동일하다는 것을 말하는 것은 사실이 아닙니다. 나는이 fnc의 본문에서 첫 줄을 정말 좋아한다. 감사. 그리고 람다에 관해서? 해산. 가장 단순한 상황에서만 사용할 수 있지만 고급 사용이 필요한 사람은 "명명 된"fncs를 사용해야합니다. 해산. 귀하의 답변에 감사드립니다. –

+0

@ Moo-Juice 내 "실제 예"에서는 실제로 작동하지 않습니다. 이유? Type에서 할당이 오버로드되었습니다. –

+0

@ 거기에 아이디어의 끝 부분에 그 일부 (또는 예제 코드)를 붙일 수 있습니까? –

1

람다에게 문의하십시오. 그것은 펑터 (functor)이므로 효과적으로 람다 (lambda)를 호출하기 위해서는 그 끝에()가 필요합니다.

내가 잘못 읽은 것 같습니다. 죄송합니다.


는하지만이 이미 SO Template type is not "seen" by the compiler inside a lambda

에 유사한 게시물입니다 그리고 여기에 대한 표준에서 인용와 같은 문제를 의미 다른 링크입니다. templates, typename, lambda -> dependent names not dependent?

+0

@RedX 게시하기 전에 답을 확인 했습니까? –

+0

어떤 컴파일러를 사용하고 있습니까? 그것은 C++ 0x를 지원합니까? – RedX

+0

이것은 컴파일되지 않는 이유를 설명하지는 않습니다. – Suma

2

,하지만 난 단지 VS 2010 제한 생각하고 괜찮 컴파일한다 C++ 0x (참조 : templates, typename, lambda -> dependent names not dependent?). 나는 당신이 보는 메커니즘이 다음과 같다고 생각합니다 :

템플릿을 정의 할 때 템플릿 매개 변수로 정의 된 유형은 일부 측면에서 "완전히 본격적인"유형 이름이 아닙니다. 예를 들어 누군가가 X<Foo>::Type (예에서 X 사용)이 Foo를 반환한다고 예상 할 수 있지만 실제로는 그렇지 않습니다.