编译以下项目时,出现以下编译器错误:(Visual Studio 2010)

1> usingclass.obj:错误LNK2019:未解决的外部符号“public:静态int __cdecl c1::arrSize(int * const)”(?? arrSize @ H @ c1 @@ SAHQAH @ Z)在函数“public:void中引用” __thiscall usingclass::a(void)“(?a @ usingclass @@ QAEXXZ)

码:

header :

1小时

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

我该如何解决?

最佳答案

你需要搬家

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

里面c1.h

模板实现对于使用该模板的所有翻译单位必须是可见的(除非它是专门的,而对于您而言不是)。

这解决了编译器错误,但基本问题已由Vaughn Cato的答案解决。我错过了。您仍然需要标题中的定义。

关于c++ - C++:模板不适用于其他类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9943703/

10-11 19:10