3
因此,我試圖使用一個策略,而該策略又具有非類型的模板功能。編譯器遇到了一些問題,弄清楚我正在嘗試做什麼。政策功能的非模板
例如,一個策略是這樣的:
template <int unsigned NBits> struct Foo {
/* Internal data type that provides NBits of storage */
typedef int unsigned DataType; // for example
/* Accessor */
template <int unsigned QueryBit>
bool const IsBitSet(DataType const &) const { /* ... */ }
};
其他策略使用這一對被設置的比特進行一系列操作:
template <typename FooPolicy> struct DoBar_WithFoo {
FooPolicy FooPolicy_;
bool const XOR_SpecificBits(FooPolicy::DataType const &Data) const {
// Error listed below points to this line
return FooPolicy_.IsBitSet<10>(Data)^FooPolicy_.IsBitSet<8>(Data) /* ... */ ;
}
};
用戶類需要Foo政策以及Bar政策:
template<typename FooPolicy, typename DoBar_Policy> struct UserClass {
// Use FooPolicy for data
void MyFunction() {
// Use DoBar_Policy to manipulate data
}
};
用戶將以上兩者結合如下:
typedef Foo<12> Foo_12Bits_type;
typedef DoBar_WithFoo<Foo_12Bits_Type> Bar_type;
typedef UserCLass<Foo_12Bits_type, Bar_type> MyUserClass;
MyUserClass.MyFunction();
我得到一個錯誤如下:
error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'
此錯誤指向下面的代碼位(如上評論):
/* ... */ FooPolicy_.IsBitSet<10>(Data) /* ... */
我可以從這個推斷< 10>看起來像是一個比較操作。但是,我確實要求編譯器專門化策略中包含的模板函數。
我可以這樣做嗎?我如何去做這件事?
如果有人想知道,我正在嘗試編寫一個LFSR。我希望將來轉移到不同的基礎數據類型,並將用於生成LFSR的特定多項式與用於存儲和操作LFSR位的數據類型和操作分開。
在此先感謝!
謝謝!這是一個C++ 11功能嗎? – user2030743
@ user2030743不,這也適用於C++ 98。但是對於C++ 11,規則略有改變(檢查鏈接的答案)。無論如何,幾乎所有以高級方式使用模板的人都很可能被這種攻擊所困擾,除非他們有幸能夠先閱讀這些模板。這個問題不時出現在這裏,因爲這些錯誤信息是非常神祕的,所以Google搜索不太可能找到你一個快速解決方案:-) – TemplateRex
heh。謝謝TemplateRex爲打好戰鬥:) – user2030743