2017-11-07 3 views
2

정수 벡터의 벡터 벡터 벡터의 모든 요소를 ​​합산하려고합니다. 모든 레이어에 필요가없는 문자는 std::vector<std::vector<std::vector<std::vector<int>>>>입니다. 같은 사이즈.정수 벡터의 벡터 벡터의 합 ...

내가 템플릿을 사용하여 달성하고자하는, 그래서 그것을했다 :

namespace nn 
{ 
    template < class T > 
    int sumAllElements(std::vector<T> v) 
    { 
     int size = v.size(); 
     int output = 0; 

     for (int i = 0 ; i < size ; i++) 
     { 
               //should call the function below 
      output += sumAllElements(v[ i ]); //or this function, depending in 
               //which "layer" we are 
     } 

     return output; 
    } 

    int sumAllElements(std::vector<int> v) 
    { 
     int size = v.size(); 
     int output = 0; 

     for (int i = 0 ; i < size ; i++) 
     { 
      output += v[ i ]; //we've reached the bottomest layer, 
           //so just sum everybory 
     } 

     return output; 
    } 
} 

하지만, 이런 일이 :

CMakeFiles\test.dir/objects.a(main.cpp.obj): In function `main': 
D:/test/main.cpp:49: undefined reference to `int nn::sumAllElements<std::vector<int, std::allocator<int> > >(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >)' 
collect2.exe: error: ld returned 1 exit status 
mingw32-make.exe[3]: *** [CMakeFiles\test\build.make:141: test.exe] Error 1 
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:67: CMakeFiles/test.dir/all] Error 2 
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:79: CMakeFiles/test.dir/rule] Error 2 
mingw32-make.exe: *** [Makefile:117: test] Error 2 

정말 ... 왜 모르는

미리 감사드립니다.

+1

왜 이것이 다운 voted인지 확실하지 않습니다. 템플릿에서의 이름 검색은 간단합니다. – MSalters

+0

질문이 downvoted 경우 나는 볼 수 없다 ... –

+0

'벡터 '대신'int sumAllElements (int x)'를 쓰고'return x'를 쓰면 어떨까요? – zahir

답변

2

이전에 int sumAllElements(std::vector<int> v)이라는 선언을 간단하게해야하는 경우 중 하나입니다. 함수가 main.cpp와는 별도의 컴파일 유닛에있는 것처럼 보입니다. 함수가 .h 파일에있는 경우 #include은 main.cpp의 헤더 파일입니다.

I 템플릿 전문화 선언을 이용하여 제안 :

template<> 
int sumAllElements(std::vector<int> v) 
{ 
... 
} 

다른 관련없는 제안, CONST 참조 벡터를 전달하는 것이다. 현재 벡터 값이 큰 경우 비용이 많이 드는 값으로 전달합니다. 당신은 필요한 전문성을 활성화/비활성화 할 수 SFINAE을 사용할 수 있습니다

+0

당신이 말했듯이 문제는 내가 기능을 배치 한 곳이었습니다. 나는 .h를 네임 스페이스 nn과 함께 함수 sumAllElements와 클래스 선언으로 갖습니다. a.cpp 클래스의 메소드 정의와 네임 스페이스 메소드 (둘 다 sumAllElements 형식); main.cpp, 여기에 .h가 포함되어 있지만 sumAllElements를 찾을 수없는 것 같습니다. 왜 그런지 이해하지 못합니다 ... main.cpp에이 함수를 넣으면 @ Bob__ 않았다). –

+0

그리고 첫 줄에 "무효"템플릿이 있다는 것을 이해하지 못했습니다 ... –

+1

@HenriqueGarcia '템플릿 <>'은 템플릿 전문입니다. 즉,'std :: vector '타입에 대한 명시 적 구현을 ​​정의하고 있음을 의미합니다. .h 파일에 정의 된 함수로 컴파일하지 않는 이유를 모르겠습니다. 모든 코드를 표시하고 파일이 어떤 파일인지 명시해야합니다. – kshanholtzer

2

아직 선언되지 않은 함수는 호출 할 수 없습니다. 템플릿을 사용하면 때때로 문제가 사라질 수 있지만 항상 그런 것은 아닙니다. 그리고 이것은 template < class T > int sumAllElements(std::vector<T> v)

+0

음, 방금 해봤지만 작동하지 않았습니다. 동일한 오류가 발생했습니다. –

+1

@HenriqueGarcia 글쎄, 나도 해봤 어 https://ideone.com/KtD40n –

+1

@HenriqueGarcia 표준 라이브러리를 사용해보십시오. 유용한 알고리즘으로 가득차 있습니다 : https://ideone.com/VU8X8A –

1

: (! 깔끔한)

template <class T, std::enable_if_t<std::is_arithmetic<T>::value, int> = 0> 
auto sum_all(const std::vector<T>& v) 
{ 
    T sum = 0; 

    for (auto& e : v) 
    { 
     sum += e; 
    } 

    return sum; 
} 

template <class T, std::enable_if_t<!std::is_arithmetic<T>::value, int> = 0> 
auto sum_all(const std::vector<T>& nested_v) 
{ 
    decltype(sum_all(nested_v[0])) sum = 0; 

    for (auto& e : nested_v) 
    { 
     sum += sum_all(e); 
    } 

    return sum; 
} 

그것이 on coliru


C++ (17)는 하나의 기능을 가질 수로보기 :

template <class T> 
auto sum_all(const std::vector<T>& nested_v) 
{ 
    innermost_type_t<T> sum = 0; 

    for (auto& e : nested_v) 
    { 
     if constexpr(std::is_arithmetic<T>::value) 
      sum += e; 
     else 
      sum += sum_all(e); 
    } 

    return sum; 
} 

innermost_type_t :

template <class T> struct innermost_type 
{ 
    using type = T; 
}; 

template <class T> struct innermost_type<std::vector<T>> 
{ 
    using type = typename innermost_type<T>::type; 
}; 

template <class T> 
using innermost_type_t = typename innermost_type<T>::type; 
+0

H % lly sh! t! 하하 잘 알고 있습니다. 감사 :) –