考慮以下幾點:單模板實例
/* T.h */
template <class T>
void Too() {
std::cout << " Template: " << typeid(T).name()
<< " size: " << sizeof(T) << std::endl;
}
/* A.h */
extern void FooA();
/* A.cpp */
struct Local {
int a[2];
}
void FooA() {
Local l;
std::cout << "<Foo A>:\n" << " Real: " << typeid(l).name()
<< " size: " << sizeof(l) << std::endl;
Too<Local>();
}
/* B.cpp */
struct Local {
int a[4];
};
void FooB() {
Local l;
std::cout << "<Foo B>:\n" << " Real: " << typeid(l).name() \
<< " size: " << sizeof(l) << std::endl;
Too<Local>();
}
/* main.cpp */
int main() {
FooA();
FooB();
return 0;
}
編譯和運行結果:
<Foo A>:
Real: 5Local size: 8
Template: 5Local size: 8
<Foo B>:
Real: 5Local size: 16
Template: 5Local size: 8
這意味着,用於這兩個模板調用一個模板實例。值得注意的是 - 第一個。 雖然可以通過定義Too()
作爲
template <class T, size_t s = sizeof(T)> Too();
我想知道有什麼比較通用的方法對這一問題解決這一「功能」?因爲如果兩個調用結構的大小相同,上面的代碼仍然會失敗。
編輯:
特別是我的問題就在於,我無法改變的文件A和B.所以我可能不會引入匿名命名空間給他們。 有沒有模板方面的解決方案?因此第二個模板參數。
我可能誤解了這一點,但它似乎你打破了一個定義規則,因此得到未定義的行爲。您的程序中有2個不同的結構,稱爲全局名稱空間中的「本地」。 – 2013-05-14 12:54:21
將'struct Local'包裝在一個匿名命名空間中。 – hmjd 2013-05-14 12:55:51