Ошибка ссылки при использовании шаблонов - PullRequest
1 голос
/ 15 февраля 2009

Я преобразовал функцию в шаблон и начал получать эту ошибку. Я не должен понимать ограничения шаблонов. Может кто-нибудь сказать мне, почему это сломано?

Я получаю эту ошибку:

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;
}

Ответы [ 2 ]

3 голосов
/ 15 февраля 2009

По причинам, указанным Ури, методы шаблона обычно определяются в заголовочном файле. Поскольку ваша функция является функцией, а не методом класса, определите ее (в файле заголовка, который может быть включен более чем одним файлом 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 теперь видит полное объявление функции шаблона.

Здесь перечислены другие решения: Как я могу избежать ошибок компоновщика с моими функциями шаблона?

2 голосов
/ 15 февраля 2009

Прошло много лет с тех пор, как я много занимался C ++, но я думаю, что вы столкнулись с проблемой отдельной компиляции. Шаблоны создаются при компиляции, а не при компоновке.

Поэтому, когда вы делаете вызов функции foo (), вы на самом деле не создаете экземпляр шаблона в том смысле, что не создается новый код функции, вы просто создаете символ, который должен разрешить компоновщик.

Однако, когда второй файл скомпилирован, у него есть только шаблон, и он никогда не создается, поэтому не создается версия foo (), которая фактически имеет дело с int. В результате, когда вы связываете все вместе, вы получаете ошибку.

Я не уверен на 100%, что с этим делать, но я подозреваю, что вам нужно было бы принудительно создать экземпляр функции foo () с int в этом втором файле (при условии, что это C ++). Я работал только с шаблонами классов, а не шаблонами функций, я уверен, что кто-то здесь даст вам точный код за несколько ...

...