Recently, I struggled a bit with variable templates in C++ and found something that I do not understand. Suppose you have two global variables a
and b
which are declared as extern in a header file. The difference between those two is, that b
is a variable template and a
is not. Now, the thing I do not understand is, that a
does need a definition but b
does not.
So my question is, why does b
need no definition but a
does or rather why does the linker know, where b
is defined? Can I explicitly define b
? If yes, where and how?
Maybe I am doing something wrong, but the code compiles, links and runs correctly with the VC++ 2017 compiler if I test it.
Here is the related code:
// header.hpp
#pragma once
extern int a;
template<typename T>
extern T b;
// source.cpp
#include "header.hpp"
int a; // definition of a, but definition of b is missing
// main.cpp
#include "header.hpp"
int main()
{
a = 1;
b<int> = 1;
return 0;
}