C ++:模板不能从另一个类运行

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

1> usingclass.obj:error LNK2019:在函数“public:void”中引用了无法解析的外部符号“public:static int __cdecl c1 :: arrSize(int * const)”(?? $ arrSize @ H @ c1 @@ SAHQAH @ Z) __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);
}

我如何解决这个问题?


你需要移动

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

c1.h里面。

所有使用该模板的翻译单元都必须能够看到模板实现(除非它是专门的,在您的情况下不是)。

这解决了编译器错误,但是根据Vaughn Cato的回答解决了潜在的问题。 我错过了。 您仍然需要标题中的定义。


不要这样做! 声明是误导性的。

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将对数组的引用作为参数。 数组的类型和数组的大小是模板参数,可以由编译器推导出来。 内联成员函数然后返回由编译器确定的大小。


我认为你必须在c1.h中定义你的模板。 因为当您在usingclass.h中包含c1.h时,尝试使用模板时,它找不到模板的扩展。

或者如果你想在c1.cpp中实现模板,那么你必须在using.h中包含c1.cpp。

链接地址: http://www.djcxy.com/p/37133.html

上一篇: C++: Templates not working from another class

下一篇: C++ code file extension? .cc vs .cpp