C ++: шаблоны не работают из другого класса - PullRequest
1 голос
/ 30 марта 2012

Когда компилируется следующий проект, я получаю следующую ошибку компилятора: (Visual Studio 2010)

1> usingclass.obj: ошибка LNK2019: неразрешенный внешний символ «public: static int __cdecl c1 :: arrSize (int * const)» (?? $ arrSize @ H @ c1 @@ SAHQAH @ Z), указанный в функции " public: void __thiscall usingclass :: a (void) "(? a @ usingclass @@ QAEXXZ)

Код:

Заголовки:

c1.h

#pragma once
#include <array>
class c1
{
    c1(void);
    ~c1(void);
public:
    template<class T>
    static int arrSize(T arr[]);
};

usingclass.h

#pragma once
#include "c1.h"

class usingclass
{
public:
    usingclass(void);
    ~usingclass(void);
    void a();
};

Исходные файлы:

c1.cpp

#include "c1.h"

c1::c1(void)
{
}


c1::~c1(void)
{
}

template <class T>
int c1::arrSize(T arr[])
{
    return (sizeof(arr)/sizeof(arr[0]));
}

usingclass.cpp

#include "usingclass.h"

usingclass::usingclass(void)
{
}


usingclass::~usingclass(void)
{
}

void usingclass::a()
{
    int a[2] = {1,2};
    int b = c1::arrSize<int>(a);
}

Как мне это исправить?

Ответы [ 3 ]

7 голосов
/ 30 марта 2012

Не делай этого!Объявление вводит в заблуждение.

template <class T>
int c1::arrSize(T arr[])
{
    return (sizeof(arr)/sizeof(arr[0]));
}

эквивалентно

template <class T>
int c1::arrSize(T *arr)
{
    return (sizeof(arr)/sizeof(arr[0]));
}

, что не даст вам того, чего вы хотите.Правильный способ сделать это так:

class c1
{
    c1(void);
    ~c1(void);
public:
    template<class T,int N>
    static int arrSize(T (&arr)[N]) { return N; }
};

arrSize принимает ссылку на массив в качестве параметра.Тип массива и размер массива являются параметрами шаблона и могут быть определены компилятором.Затем встроенная функция-член просто возвращает размер, определенный компилятором.

2 голосов
/ 30 марта 2012

Вам нужно переехать

template <class T>
int c1::arrSize(T arr[])
{
    return (sizeof(arr)/sizeof(arr[0]));
}

внутри c1.h.

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

Это решает ошибку компилятора , но основная проблема решается с ответом Вона Катона. Я пропустил это. Вам все еще понадобится определение в заголовке.

0 голосов
/ 30 марта 2012

Я думаю, что вы должны определить свой шаблон в самом c1.h.Потому что, когда вы включаете c1.h в ваш файл usingclass.h и пытаетесь использовать шаблон, он не находит расширения для шаблона.

Или Если вы хотите перейти к реализации шаблона в c1.cpp, тогдаВы также должны включить c1.cpp в usingclass.h.

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