C++:模板无法在其他类中运行

NBc*_*ode 1 c++ templates

编译以下项目时,我收到以下编译器错误:(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[]);
};
Run Code Online (Sandbox Code Playgroud)

usingclass.h

#pragma once
#include "c1.h"

class usingclass
{
public:
    usingclass(void);
    ~usingclass(void);
    void a();
};
Run Code Online (Sandbox Code Playgroud)

源文件:

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]));
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Vau*_*ato 7

不要这样做!该声明具有误导性.

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

相当于

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

这不会给你想要你想要的.正确的方法是这样的:

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

arrSize将对数组的引用作为参数.数组的类型和数组的大小是模板参数,可以由编译器推导出来.然后,内联成员函数只返回编译器确定的大小.