Следующий код, который имеет 2 определения для элемента поля stati c, каждое определение определяет template1<int>::x
с другим значением.
Можно ожидать, что компоновщик отклонит такие переопределения, поскольку они имеют разные значения.
Но компиляция и компоновка проходят как для g ++, так и для MSV C, и то, какое определение используется, зависит от порядка, в котором источники передаются компоновщику.
Is это поведение соответствует стандарту C ++, неопределенное поведение или ошибка компоновщика?
my_template.h
template <class T>
class template1
{
public:
static int x;
};
Src2. cpp
#include <stdio.h>
#include "my_template.h"
template <class T>
int template1<T>::x = 2;
void my_func() // definition
{
printf("my_func: template1<int>::x = %d\n", template1<int>::x); // definition of X to 2.
printf("my_func: template1<char>::x = %d\n", template1<char>::x); // definition of X to 2.
}
Main. cpp
#include <cstdio>
#include "my_template.h"
template <class T>
int template1<T>::x = 1;
void my_func();
int main()
{
printf("main: template1<int>::x = %d\n", template1<int>::x); // definition of X to 1.
my_func();
return 0;
}
Скомпилировать с g ++ (MinGW.org G CC Build-20200227-1) 9.2.0 +
Compile1
g++ -o prog Src2.cpp Main.cpp
Output1
main: template1<int>::x = 2
my_func: template1<int>::x = 2
my_func: template1<char>::x = 2
Compile2
g++ -o prog Main.cpp Src2.cpp
Ouput2
main: template1<int>::x = 1
my_func: template1<int>::x = 1
my_func: template1<char>::x = 2
Наблюдается также с
Microsoft (R) C/C++ Optimizing Compiler Version 19.25.28612 for x86
Когда я разбирал код с флагом -S
, каждая единица компиляции d определено то же имя символа.
Совместная работа с Nightra .