2016-07-13 3 views
0

다음과 같은 멤버 변수로 정렬되지 않은 맵이있는 프로그램이 있습니다. initialize_resource_map을 추가 한 멤버 함수에서 맵을 초기화하고 싶습니다.멤버 함수에서 순서가 지정되지 않은 맵 초기화

#include <unordered_map> 
#include <thread> 
#include <functional> 
#include <iostream> 
#include <sstream> 
#include <algorithm> 
#include <fstream> 
#include <vector> 

template < class socket_type > class MyClass { 

    std::unordered_map < std::string, std::unordered_map < std::string, 
    std::function < void (std::shared_ptr < typename MyClass <socket_type>::Response >, 
    std::shared_ptr < typename MyClass <socket_type>::Request >) > >>resource; 

    class Request: public std::ostream 
    { 


    }; 

    class Response 
    { 


    }; 
    void initialize_resource_map(MyClass server, std::string pattern, 
           std::function <void (std::shared_ptr < typename MyClass <socket_type>::Response> response_func, 
           std::shared_ptr < typename MyClass <socket_type>::Request> request_ptr)) 
    { 
     server.resource[pattern]["GET"] = 
         [&server] (response_func, request_ptr) 
     { 
         std::string number = request_ptr->path_match[1]; 
         *response_func << "HTTP/1.1 200 OK\r\nContent-Length: " << number.length() << "\r\n\r\n" << number; 
     } 
    }; 
}; 


int main() 
{ 


    return 0; 
} 

다음 명령을 사용하여 컴파일 중입니다.

g++ -std=c++11 test.cpp -o test 

다음과 같은 오류가 발생합니다.

test.cpp:29:106: error: template argument 1 is invalid 
            std::shared_ptr < typename MyClass <socket_type>::Request> request_ptr)) 
                             ^
test.cpp:29:106: error: template argument 1 is invalid 
test.cpp:29:106: error: template argument 1 is invalid 
test.cpp:29:106: error: template argument 1 is invalid 
test.cpp:29:106: error: template argument 1 is invalid 
test.cpp:28:39: error: ‘std::function’ is not a type 
            std::function <void (std::shared_ptr < typename MyClass <socket_type>::Response> response_func, 
            ^
test.cpp:28:48: error: expected ‘,’ or ‘...’ before ‘<’ token 
            std::function <void (std::shared_ptr < typename MyClass <socket_type>::Response> response_func, 
               ^
test.cpp: In member function ‘void MyClass<socket_type>::initialize_resource_map(MyClass<socket_type>, std::string, int)’: 
test.cpp:32:36: error: ‘response_func’ has not been declared 
         [&server] (response_func, request_ptr) 
            ^
test.cpp:32:51: error: ‘request_ptr’ has not been declared 
         [&server] (response_func, request_ptr) 
               ^
test.cpp: In lambda function: 
test.cpp:34:46: error: ‘request_ptr’ was not declared in this scope 
         std::string number = request_ptr->path_match[1]; 
              ^
test.cpp:35:26: error: ‘response_func’ was not declared in this scope 
         *response_func << "HTTP/1.1 200 OK\r\nContent-Length: " << number.length() << "\r\n\r\n" << number; 
         ^
test.cpp: In member function ‘void MyClass<socket_type>::initialize_resource_map(MyClass<socket_type>, std::string, int)’: 
test.cpp:37:5: error: expected ‘;’ before ‘}’ token 
    }; 

저는 템플릿 프로그래밍을 처음 사용합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 이것은 멤버 함수로 변환하려고하는 정렬되지 않은 맵을 초기화하는 원래 코드입니다.

std::shared_ptr < typename MyClass <socket_type>::Request> request_ptr)) 

이것은

std::shared_ptr < typename MyClass <socket_type>::Request> request_ptr)>) 

내가 공개 일치 emacs의 자동 강조의 큰 팬이 있어야한다 : 경우 일부 문장 부호가이 라인에없는

int main() 
{ 
    typedef Server <HTTP> HttpServer; 
    HttpServer server(8080, 1); 

    server.resource["^/match/([0-9]+)$"]["GET"] = 
       [&server] (std::shared_ptr <HttpServer::Response> response, std::shared_ptr <HttpServer::Request> request) { 
       std::string number = request->path_match[1]; 
       *response << "HTTP/1.1 200 OK\r\nContent-Length: " << number.length() << "\r\n\r\n" << number; 
    }; 




    return 0; 
}     
+2

일부 typedef를 사용할 수 있습니다. 아마 당신의 실수도 쉽게 찾아 낼 수있을 것입니다. 당신이 의미하는 이름 공간에 대한 –

+0

typedefs? – liv2hak

답변

1

을하는 데 도움이/닫는 괄호/괄호/대괄호 등 ...이 오타가 아주 분명했습니다.

다른 오류는이 라인에 :

server.resource[pattern]["GET"] = 
        [&server] (response_func, request_ptr) 

어느 response_func,도 request_ptr가 정의되어 있습니다. 그것들은 앞의 std::function의 서명에서 사용 된 매개 변수 유형으로 명명되었습니다. 귀하의 질문에 전체 코드가 아니라 코드를 삭제했기 때문에 이것이 나에게 보이게됩니다. 전체 코드가 이러한 변수를 정의 할 가능성이 큽니다. 그렇지 않은 경우에는이 변수를 어디에서 정의해야하는지 아무도 알려 줄 수 없으므로이 변수를 직접 계산해야합니다. 이것은 표시된 코드에서 명확하지 않습니다.

편집 : 질문에 포함 된 부가 정보에 기초하여, 멤버 함수의 나머지 문제는 있어야한다는 것이다 : 같이

void initialize_resource_map(MyClass server, std::string pattern, 
          std::function <void (std::shared_ptr < typename MyClass <socket_type>::Response> response_func, 
          std::shared_ptr < typename MyClass <socket_type>::Request> request_ptr)>) 
{ 
    server.resource[pattern]["GET"] = 
        [&server] (std::shared_ptr < typename MyClass <socket_type>::Response> response_func, std::shared_ptr < typename MyClass <socket_type>::Request> request_ptr) 
    { 
        std::string number = request_ptr->path_match[1]; 
        *response_func << "HTTP/1.1 200 OK\r\nContent-Length: " << number.length() << "\r\n\r\n" << number; 
    }; 
} 

람다의 파라미터는 유지해야; 세미콜론이 잘못 배치되었습니다.

참고로 복잡한 유형은 최종 결과를 약간 지저분하게 만듭니다. 그게 꽤 흔한 일이고, typedef 님이 이것을 정리하는 데 경이를 보입니다. 이 훨씬 청소기 보이지 않는 :

typedef std::shared_ptr <Response> response_func_t; 

typedef std::shared_ptr <Request> request_ptr_t; 

void initialize_resource_map(MyClass server, std::string pattern, 
       std::function <void (response_func_t response_func, 
             request_ptr_t request_ptr)>) 
{ 
    server.resource[pattern]["GET"] = 
     [&server] (response_func_t response_func, 
        request_ptr_t request_ptr) 
     { 
      std::string number = request_ptr->path_match[1]; 
      *response_func << "HTTP/1.1 200 OK\r\nContent-Length: " << number.length() << "\r\n\r\n" << number; 
     }; 
} 

그러나, 이것은 아직 정의되지 않은 동작, 그리고 가능성이 컴파일에도 불구하고, 충돌이 발생합니다. 람다는 참조로 server을 캡처하지만 참조는 로컬 범위이므로 참조 된 변수가 멤버 함수가 반환 되 자마자 범위를 벗어나 캡처 된 변수가 더 이상 유효하지 않게됩니다.

하지만 컴파일 오류가 해결됩니다. 스스로 범위 지정 문제를 찾아야합니다.

+0

위의 업데이트 된 질문을 참조하십시오. – liv2hak

+0

업데이트 됨. 컴파일 오류는 해결할 수 있지만, 언급했듯이 멤버 함수의 디자인에 큰 버그가 있습니다. 그것은 당신이 스스로 해결해야 할 것입니다. –

관련 문제