我遇到的情况,我不知道它是否可以考虑在代码中的编译器/连接或某些/误用一个错误,一个错误会影响不同的翻译单元误解C++标准。局部结构通过使用通用模板功能的
两个不同的源文件(包含实际代码中的单元测试)声明一个具有相同名称但略有不同的成员的结构。两个源文件都引用一个头文件,该头文件包含一个模板化的辅助方法,并返回模板的一个向量(以真实代码执行反序列化)。
编译完成后没有任何错误或警告,我意识到该模板只针对一种类型,并在两个翻译单元中使用(尽管类型在.cpp文件中声明),导致错误的结果。
下面是概念的一个简短证明:
Main.cpp的
#include <iostream>
#include <string>
#include "Header.h"
struct Foo
{
std::string name = "FooMain";
};
void test1()
{
auto v = getVector<Foo>();
std::cout << v[0].name << ' '
<< v[1].name << '\n';
}
void test2();
int main()
{
test1();
test2();
}
Second.cpp
#include <iostream>
#include <string>
#include "Header.h"
struct Foo
{
std::string name = "FooSecond";
int extraInfo = 1;
};
void test2()
{
auto v = getVector<Foo>();
std::cout << v[0].name << ' ' << v[0].extraInfo << ' '
<< v[1].name << ' ' << v[1].extraInfo << '\n';
}
Header.h
#ifndef _HEADER_H_
#define _HEADER_H_
#include <vector>
template<typename T>
auto getVector()
{
std::vector<T> result;
result.push_back({});
result.push_back({});
return result;
}
#endif
输出是(每一次数字是不同的),两者的Visual Studio 2015年和gcc 4.9.2下(32位Windows)中
FooMain FooMain
FooMain 1299148614 FooMain 1097202845
注释掉test1()
使代码test2()
返回预计产量为FooSecond 1 FooSecond 1
。
任何想法可能会导致此? 谢谢