When the following project is compiled, I get the following compiler error: (Visual Studio 2010)
1>usingclass.obj : error LNK2019: unresolved external symbol “public: static int __cdecl c1::arrSize(int * const)” (??$arrSize@H@c1@@SAHQAH@Z) referenced in function “public: void __thiscall usingclass::a(void)” (?a@usingclass@@QAEXXZ)
Code:
Headers:
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();
};
Source files:
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);
}
How do I fix that?
You need to move
inside
c1.h.Template implementations must be visible to all translation units using that template (unless it’s specialized, and in your case it’s not).
This solves the compiler error but the underlying issue is solved with Vaughn Cato’s answer. I missed that. You’ll still need the definition in the header.