我有一個模板類,我聲明在一個方法的標題與沒有在該標題中的方法的定義。在.cc文件中,我定義了方法的專業化版本,但沒有在頭文件中聲明它們。在一個不同的.cc文件中,我爲不同的模板參數調用了專門化的方法。它看起來像這樣:模板類成員專業化沒有聲明在標頭
了foo.h:
template<typename T>
class Foo {
public:
static int bar();
};
foo.cc:
#include "foo.h"
template<>
int Foo<int>::bar() {
return 1;
}
template<>
int Foo<double>::bar() {
return 2;
}
main.cc:
#include <iostream>
#include "foo.h"
int main(int argc, char **argv) {
std::cout << Foo<int>::bar() << std::endl;
std::cout << Foo<double>::bar() << std::endl;
return 0;
}
這個程序用gcc編譯和鏈接成功4.7.2適用於所有C++標準(C++ 98,gnu ++ 98,C++ 11和gnu ++ 11)。輸出是:
1
2
這對我有意義。由於main.cc翻譯單元沒有看到bar()
或其任何專門化的定義,因此它期望bar()
的調用在某些其他翻譯單元中使用明確定義的bar()
的非特定定義。但是由於名稱修改是可預測的,因此foo.cc中的專業化具有與非專用定義的顯式實例相同的符號名稱,因此main.cc能夠使用這些專業化,而不會在該翻譯單元中聲明它們。
我的問題是這樣的:這是一個意外,還是這種行爲由C++標準強制?換句話說,這個代碼是否便攜?
我能找到的最相關的以前的問題是Declaration of template class member specialization,但它不包括這個特殊情況。 (如果你想知道爲什麼這對我來說很重要,那是因爲我使用這樣的代碼作爲一種編譯時查找表,如果我沒有聲明專門化,它會縮短很多。)
這是一個相當不錯的第一個問題!我認爲IBM的編譯器允許您使用extern關鍵字聲明專業化,但從未自己完成。 – 2013-02-25 07:15:09