我遇到的情況,我不知道它是否可以考慮在代碼中的編譯器/連接或某些/誤用一個錯誤,一個錯誤會影響不同的翻譯單元誤解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
。
任何想法可能會導致此? 謝謝