Я столкнулся с какой-то странной вещью с параметрами шаблона.
По сути, у меня есть два файла cpp с разными структурами, но с одинаковым именем. (оба в анонимном пространстве имен.) Когда я передаю структуры в шаблонную функцию, вызывается один и тот же экземпляр шаблона этой функции. Тот видит обе структуры как одинаковые.
Я не понимаю, это ошибка компилятора или я просто новичок.
В моем реальном коде это привело к неприятной ошибке, поэтому я написал простой тест. (Я опустил охранники здесь.)
SomeFunc.hpp:
template<typename T> int someFunc(const T& obj) {
return sizeof(T);
}
Test1.hpp:
int testFunc1();
Test1.cpp:
#include "Test1.hpp"
#include "SomeFunc.hpp"
struct CTestStruct{int a; int b; float c;};
int testFunc1() {
CTestStruct test_sturct;
return someFunc( test_sturct);
}
Test2.hpp:
int testFunc2();
Test2.cpp:
#include "Test2.hpp"
#include "SomeFunc.hpp"
struct CTestStruct{char a; float b;};
int testFunc2() {
CTestStruct test_sturct;
return someFunc( test_sturct);
}
main.cpp:
#include "Test1.hpp"
#include "Test2.hpp"
int main(){
std::cout << testFunc1() << "\n";
std::cout << testFunc2() << "\n";
return 0;
}
Выход:
12
12
Проблема в том, что testFunc1 и testFunc2 видят две разные структуры, но someFunc рассматривает их как одинаковые. Когда я изменяю testFunc1 на {return 0;}
(таким образом, экземпляр шаблона не генерируется для этой строки), вывод:
0
8
Компилятор - GCC 7.3.0.