2013-08-16 34 views
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位的數據類型和操作分開。

在此先感謝!

回答

2

您需要通過只是成員的姓名之前插入template關鍵字來澄清對調用嵌套函數模板:

bool const XOR_SpecificBits(FooPolicy::DataType const &Data) const { 
    // Error listed below points to this line 
    return FooPolicy_.template IsBitSet<10>(Data)^FooPolicy_.template IsBitSet<8>(Data) /* ... */ ; 
        ^^^^^^^^         ^^^^^^^^ 
} 

對於爲什麼有許多工作要做,看到this famous Q&A

+0

謝謝!這是一個C++ 11功能嗎? – user2030743

+1

@ user2030743不,這也適用於C++ 98。但是對於C++ 11,規則略有改變(檢查鏈接的答案)。無論如何,幾乎所有以高級方式使用模板的人都很可能被這種攻擊所困擾,除非他們有幸能夠先閱讀這些模板。這個問題不時出現在這裏,因爲這些錯誤信息是非常神祕的,所以Google搜索不太可能找到你一個快速解決方案:-) – TemplateRex

+0

heh。謝謝TemplateRex爲打好戰鬥:) – user2030743