2017-12-10 1 views
1

C++로 배열의 길이를 반환하기 위해 온라인에서 찾은 템플릿 함수를 사용하고 있습니다. 나는 직접 메서드를 호출하면 다른 메서드를 통해 호출 할 때 작동하지만 오류가 발생하는 것으로 나타났습니다. no instance of function template "array_size" matches the argument list.도우미 함수에서 템플릿 함수를 호출 할 수 없습니다.

나는 분명히 방법을 통해 배열을 전달하는 방법에 대해 오해했지만 분명히 이것이 작동하지 않는 이유에 대해 왜곡되어 있습니다.

template<size_t SIZE, class T> inline size_t array_size(T(&arr)[SIZE]) { 
    return SIZE; 
} 
int wordLength(char* word) { 
    return array_size(word) - 1; // Gets argument error 
} 
void fooBar() { 
    int n = array_size("Hello"); // Works! 
    int m = wordLength("Hello"); // What I want } 

은 무엇 세부 내가 이것에 대해 실종이고 어떻게하면 그런 내가 당신을 어떻게 array_size 작품을 오해하는 wordLength

+1

'wordLength'에는 배열이 없기 때문에 단순히 불가능합니다. 가지고있는 것은 포인터 뿐이며 포인터가 가리키는 데이터 나 메모리에 할당 된 메모리 양을 알 수있는 방법이 없습니다. 컴파일 타임에 문자열의 길이를 얻으려면'constexpr' 인수와'constexpr' 재귀 함수를 사용해야합니다. –

+1

wordlength를'int wordLength (char word []) '로 선언하면 작동합니까? –

+2

이 템플릿은 컴파일시에만 배열에서 작동하며 char 및 실행시 포인터에 대해이 템플릿을 사용하려고합니다. 'wordLength'는 어떤 형태 로든지 배열 길이 데이터를 가지고 있지 않으므로 결코 작동하지 않을 것입니다. 이것은 C++이므로'std :: string'을 사용하십시오. –

답변

5

를 호출 할 수있는 해결 않습니다. 유형 자체에서 배열 길이 정보를 검색하므로 array_size("Hello")의 경우 리터럴 "Hello"의 유형은 실제로 const char[6]입니다. 그러나 함수 wordLength을 사용하면 유형에서 길이 정보가 지워지고 단지 char*이됩니다.

template <typename T, size_t N> 
int wordLength(T (&word)[N]) { 
    return array_size(word) - 1; 
} 

그러나, 나는 당신이 실제로 작업을 수행하지 않는 것이 좋습니다 :

코드를 해결하기위한 직접적인 방법은 wordLength 템플릿을하는 것입니다. 더 좋은 방법은 문자열로 작업하려는 경우 std::string 유형으로 전환하는 것입니다. 스택 할당 고정 크기 배열을 사용하려면 std::array으로 설정하십시오. 동적 배열로 작업하려면 std::vector으로 이동하십시오. 외부 API로 작업 할 때를 제외하고는 C++에서 C 스타일 배열의 유스 케이스가 거의 없으므로 코드에서 사용하지 않는 것이 좋습니다.

관련 문제