2012-05-14 4 views
4

C++ 11을 조금 더 알고 싶습니다. 가능한 가장 간단한 initializer_list 테스트를 작성 했으니 템플릿 내부에서 "자유"함수입니다.템플릿의 C++ 이니셜 라이저 목록

namespace mlcppl{ 
template<typename Tp> vector<Tp> makevec (initializer_list<Tp> initlist) 
{ 
    vector<Tp> vt; 
    for(Tp x : initlist) 
    { 
     vt.insert(vt.end(), x); 
    } 
    return vt; 
    } 
} 

여기가 호출되는 경우입니다 : 내가 (꽤 형식에 대한 연타 ++) 컴파일 할 때마다, 와 나는 여기

/home/alex/repo/mine/mlcppl/test/utiltest1.cc:16:3: error: no matching function for call to 'makevec' 
mlcppl::makevec<string> ({"alex", "herrmann"}); 

는 코드이 오류가

#include <util.hh> 
int main() 
{ 
    vector<string> vc; 
    vc = makevec<string> ({"alex", "herrmann"}); 
    return 0; 
} 

나는 이것이 일어날 이유를 전혀 모른다. 어떤 제안이 있나?

이 g 작동
+0

네임 스페이스 한정자를 사용하여'makevec'를 호출하고 있습니다. 'makevec' 구현은'mlcppl' 네임 스페이스에 실제로 정의되어 있습니까? 귀하의 본보기는 그것을 보여주지 않습니다. – plasma

+0

예, 잠시만 기다려주세요. 게시물에 전체적인 의미를 넣으십시오. – alexmherrmann

+1

코드가 잘 작동해야합니다. clang의 버전은 무엇입니까? 또한 makevec의 본문은 단순히'return initlist; '로 대체 될 수 있습니다. – bames53

답변

4

++ (Ideone는) :

#include <vector> 
#include <string> 

template<typename Tp> std::vector<Tp> makevec (std::initializer_list<Tp> initlist) { return initlist; } 

int main() { makevec<std::string> ({"alex", "herrmann"}); } 

++ 연타 무엇입니까?

+2

@Mooing Duck : 어리석은 짓 하지마. 그것은 코드를 포함합니다 - emsr이 어떻게 주석을 주석에 넣어야합니까? – TonyK

+0

3.0, 그리고 그것은 gcc ..... hrmmmm으로 잘 컴파일되었지만 새로운 버전을 사용해도 될까요? – alexmherrmann

+2

@alexhairyman 이니셜 라이저 목록은 3.1 http://clang.llvm.org/cxx_status.html까지 완료되지 않았습니다. (N.B. Apple은이 페이지에 나열된 버전과 약간 다른 버전을 사용합니다.) – bames53

관련 문제