функции-члены шаблона в c ++ - PullRequest
       2

функции-члены шаблона в c ++

3 голосов
/ 12 сентября 2011

У меня есть проблема с обобщениями в c ++. У меня есть два файла Matrix.h и Matrix.cpp. Вот файлы:

#pragma once
template<class T>
class Matrix
{
    public:
        static T** addSub(int size,T** firstMatrix,T** secondMatrix,int operation);
}

и Matrix.cpp

#include "Martix.h"
template<class T>
static T** Matrix<T>::addSub( int n,T **firstMatrix,T **secondMatrix,int operation)
{
    //variable for saving result operation
    T **result = new T*[n];

    //create result matrix
    for( int i=0;i<n;i++)
        result[i] = new T[n];

    //calculate result
    for( int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            result[i][j] = 
            (operation == 1) ? firstMatrix[i][j] + secondMatrix[i][j]:
                                firstMatrix[i][j] - secondMatrix[i][j];

    return result;
}

когда я запускаю их, я получаю ошибку ниже:

Error   1   error LNK2019: unresolved external symbol "public: static int * * __cdecl Matrix<int>::addSub(int,int * *,int * *,int)" (?addSub@?$Matrix@H@@SAPAPAHHPAPAH0H@Z) referenced in function "public: static int * * __cdecl Matrix<int>::strassenMultiply(int,int * *,int * *)" (?strassenMultiply@?$Matrix@H@@SAPAPAHHPAPAH0@Z) C:\Users\ba.mehrabi\Desktop\Matrix\matrixMultiplication\main.obj    matrixMultiplication

в чем проблема?

Ответы [ 3 ]

5 голосов
/ 12 сентября 2011

К сожалению, вы не можете иметь объявление класса шаблона в файлах * .cpp. Полное определение должно остаться в заголовочном файле. Это правило многих компиляторов C ++.

Смотрите это: http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12

  1. Шаблон не является классом или функцией. Шаблон - это «шаблон» что компилятор использует для генерации семейства классов или функций.
  2. Чтобы компилятор генерировал код, он должен видеть оба определение шаблона (не просто декларация) и конкретный типы / все, что использовалось для «заполнения» шаблона Например, если вы пытаясь использовать Foo, компилятор должен видеть оба шаблона Foo и тот факт, что вы пытаетесь сделать определенный Foo.
  3. Ваш компилятор, вероятно, не помнит детали одного .cpp файл во время компиляции другого файла .cpp. Может, но большинство делает нет, и если вы читаете этот FAQ, то почти наверняка нет. Кстати, это называется «отдельной моделью компиляции».

Ссылка имеет обходной путь, но имейте в виду, что шаблон - это прославленный макрос, поэтому заголовочный файл, вероятно, является лучшим местом для него.

Постер этого ТАК сообщения показывает демонстрацию обходного пути.

1 голос
/ 12 сентября 2011

Прежде всего, определение функций шаблона класса, должно идти в самом заголовке.

Во-вторых, если вы определяете функцию-член static вне класса (хотя и в самом заголовке), то не используйте ключевое слово static (в определении). Требуется только в декларации.

0 голосов
/ 12 сентября 2011

Добавьте

template Matrix<int>;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...