문제

함수를 템플릿으로 변환 하고이 오류를 얻기 시작했습니다. 템플릿의 한계를 이해해서는 안됩니다. 누군가 왜 이것이 깨진 이유를 말해 줄 수 있습니까?

이 오류를 받고 있습니다.

Undefined symbols:
  "bool foo<int>(int const&, int const&)", referenced from:
      _main in file1.o
ld: symbol(s) not found

다음 코드를 연결하면 코드는 단순화되었지만 여전히 실패합니다. 첫 번째 파일에는 다음이 포함됩니다.

#include <iostream>
template <class T> bool foo (const T&, const T&);

int main ()
{
  int left = 1;
  int right = 2;

  if (foo <int> (left, right))
    std::cout << "foo!" << std::endl;

  return 0;
}

두 번째 파일에는 다음이 포함됩니다.

template <class T> bool foo (const T& left, const T& right)
{
  return true;
}
도움이 되었습니까?

해결책

URI가 제공 한 이유 때문에 템플릿 방법은 일반적으로 헤더 파일에 정의됩니다. 귀하의 기능은 클래스의 메소드가 아닌 함수이므로 명시 적으로 (둘 이상의 CPP 파일에 포함될 수있는 헤더 파일에서) 정적 또는 인라인으로 정의하십시오.

이것을 당신의 foo.h에 넣으십시오

template<class T> inline bool foo (const T& left, const T& right)
{
  return true;
}

이것을 main.cpp에 넣으십시오

#include <iostream>
#include "foo.h"

int main ()
{
  int left = 1;
  int right = 2;

  if (foo <int> (left, right))
    std::cout << "foo!" << std::endl;

  return 0;
}

CPP 코드는 이제 템플릿 함수의 전체 선언을 봅니다.

다른 솔루션은 여기에 나열되어 있습니다. 템플릿 함수로 링커 오류를 피하려면 어떻게해야합니까?

다른 팁

C ++를 많이 한 지 몇 년이 지났지 만 별도의 편집 문제를 겪고 있다고 생각합니다. 템플릿은 연결하지 않고 컴파일시 인스턴스화됩니다.

따라서 foo ()를 호출 할 때는 새로운 기능 코드가 생성되지 않는다는 점에서 실제로 템플릿을 인스턴스화하지 않으므로 링커가 해결 해야하는 기호 만 생성합니다.

그러나 두 번째 파일이 컴파일되면 템플릿이 있고 인스턴스화되지 않으므로 실제로 ints를 다루는 foo () 버전은 생성되지 않습니다. 결과적으로 모든 것을 서로 연결하면 오류가 발생합니다.

나는 이것에 대해 무엇을 해야할지 100% 확신하지는 않지만, 두 번째 파일에서 ints와 함께 foo ()의 인스턴스화를 강요해야한다고 생각합니다 (C ++라고 가정). 기능 템플릿이 아닌 클래스 템플릿으로 만 작업했습니다. 여기 누군가가 당신에게 몇 가지에 정확한 코드를 줄 것이라고 확신합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top