我遇到了一些带有模板参数的奇怪事情。
基本上,我有两个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。