C ++-模板参数不同但名称相同的奇怪行为

时间:2018-08-28 17:47:55

标签: c++ templates gcc namespaces

我遇到了一些带有模板参数的奇怪事情。

基本上,我有两个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。

0 个答案:

没有答案