C ++ - Странное поведение с параметрами шаблона, которые отличаются, но имеют одинаковое имя - PullRequest
0 голосов
/ 28 августа 2018

Я столкнулся с какой-то странной вещью с параметрами шаблона.

По сути, у меня есть два файла 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.

...