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