>  Q&A  >  본문

c++ - 함수 템플릿 구체화. 1시간 동안 디버깅을 했습니다. 모든 방법을 시도해 보았지만 표준 답변은 정확했지만 컴파일할 수 없습니다.

내가 하고 있는 일은 C++ Primer Plus의 8장 질문 6입니다.
두 개의 함수 템플릿을 만들어야 합니다. 하나는 int 이중 배열용이고 다른 하나는 char*[]
int 및 double을 사용하는 템플릿입니다. 저는 문제 없이 작업하고 있습니다.
그런 다음 일반 함수를 사용하여 다시 작성하고 오랫동안 작업한 후에는 정상적으로 실행될 수 있음을 발견했습니다. 작동하지 않아서 온라인에서 답변을 찾았는데 동일한 답변을 썼습니다
기본적으로 형식이 동일하므로 컴파일할 수 없습니다

.

오류 메시지: main.cpp:43:23: 오류: 'const char maxn(const char, int)'의 템플릿 식별자 'maxn<const char []>'이 어떤 템플릿 선언 템플릿과도 일치하지 않습니다< ; >const char maxn<const char[]>(const char* x[], int n)

코드:

으아악
高洛峰高洛峰2736일 전635

모든 응답(3)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-05-16 13:29:45

    선언: template<> const char **maxn(const char **x, int n);template<> const char **maxn(const char **x, int n);

    调用:cout << "sx[5] max_address: " << (int*)*maxn(sx, 5) << endl;

    定义:

    template<>
    const char **maxn(const char **x, int n)
    {
        const char **max_len = x;
        for (int i = 0; i < n - 1; i++)
            max_len = strlen(*max_len) >= strlen(x[i + 1]) ? max_len : &x[i + 1];
        return max_len;
    }

    你犯了三个错误:

    • 特化语法不对

    • 特化时两处T的类型不一致

    • 多处指针没有解引用


    思路:

    模板声明:template<typename T> T maxn(T x, int n);
    调用:maxn(sx, 5)。其中变量sx的类型是const char *[5],即数组类型。

    由于sx是数组类型,模板形式参数的形式是T,这里sx会被隐式转换成指针类型(array to pointer conversion)const char **,即T是const char **

    所以特化应当是
    template<> const char **maxn(const char **x, int n);

    전화: cout << "sx[5] max_address: " << (int*)*maxn(sx, 5) <<

    정의: 🎜 으아악 🎜당신은 세 가지 실수를 저질렀습니다: 🎜
    • 🎜잘못된 특수화 구문🎜
    • 🎜두 가지 T 유형은 전문화 과정에서 일관성이 없습니다🎜
    • 🎜많은 포인터가 역참조되지 않습니다🎜
    <시간> 🎜생각:🎜 🎜템플릿 선언: template<typename T> T maxn(T x, int n);
    호출: maxn(sx, 5). 변수 sx의 타입은 배열 타입인 const char *[5]입니다. 🎜 🎜sx는 배열 유형이므로 템플릿 형식 매개변수는 T 형식입니다. 여기서 sx는 암시적으로 포인터 유형으로 변환됩니다(배열에서 포인터로 변환) const char **, 즉 T는 const char **입니다. 🎜 🎜그래서 전문화는
    template<> const char **maxn(const char **x, int n);🎜이어야 합니다. 🎜PS: 직관적으로 참조 버전에는 전문화가 있어야 합니다. 그러나 T는 참조 유형을 추론할 수 없기 때문에 여기서는 참조 버전의 특수화가 호출되지 않습니다. 물론 템플릿 매개변수를 제공하여 이 전문화를 호출할 수 있습니다. 🎜

    회신하다
    0
  • PHP中文网

    PHP中文网2017-05-16 13:29:45

    제가 이해한 바에 따르면 maxn 함수는 길이 n의 배열에서 "가장 큰" 요소를 반환해야 하므로 함수 선언은 다음과 같이 작성해야 한다고 생각합니다.

    으아아아

    이 설명에 따라 구현을 변경하면 컴파일됩니다.
    다음 코드는 원본 코드를 기반으로 간단히 수정되었으며 참조용으로 vs2017에서 컴파일되었습니다.

    으아아아

    회신하다
    0
  • 漂亮男人

    漂亮男人2017-05-16 13:29:45

    스페셜 버전을 잘못 작성하셨습니다.

    으아아아

    올바른 자세:

    으아아아

    회신하다
    0
  • 취소회신하다