C ++ неопределенная ссылка на функцию-член шаблона - PullRequest
0 голосов
/ 10 декабря 2011
//Forward declaration
class MyType;

class Factory{
    template<class T>
    static T* CreateObject(T& newOb){
         return &newOb;
    }
    //Other non template functions 
}

//In main (error causing line)
MyType tmptype;
MyType* newMyType = Factory::CreateObject<MyType>(tmptype);

Этот код вызывает эту ошибку: неопределенная ссылка на MyType * Factory :: CreateObject (MyType &) '

Я также получаю это предупреждение: предупреждение: автоматический импорт был активирован без --enable-auto-import, указанного в командной строке

Кроме того, он по-прежнему не работает, если я использую тип int, что исключает возможность неправильного включения типа.

Ответы [ 3 ]

1 голос
/ 10 декабря 2011

Функция принимает ссылку, поэтому вам нужно передать ей переменную, адрес которой может принимать компилятор.

class Factory{
public:
    template<class T>
    static T* CreateObject(T& newOb){
        return &newOb;
    }
    //Other non template functions
};

class MyType {};

int main() {
    MyType a;
    MyType* newMyType = Factory::CreateObject<MyType>(a);
}
0 голосов
/ 10 декабря 2011

Ответ прост.Ваш синтаксис вызова функции неверен.Все, что вам нужно сделать, это вызвать Factory::CreateObject(tmptype);

Вам не нужно создавать экземпляр шаблонной функции, как это делается для шаблонных классов.

0 голосов
/ 10 декабря 2011

Вы не определили MyType.Если вы передаете классу Factory объект, который хотите создать, вам нужно определить тип, который вы проходите.Без передачи типа объекта, который фабричный класс не может создать!Поэтому You MyType должен быть либо typedef для примитива, либо struct / class, который определяет ваш собственный тип данных.

В идеале

class MyType{
     //Some data structure or type that you want to use.
};

и

class Factory{
public:
    template<class T>
    static T* CreateObject(T& newOb){
        return &newOb;
    }
    //Other non template functions
}

позволитваш фабричный класс для создания объекта вашего собственного типа.

...