一個類定義如下:
template <typename T>
class A {
private:
T a;
public:
A(T& a) : a_(a) { }
template <typename D>
void Eval(D& arg)
{
// ...
}
};
template A<int>;
我想顯式實體化該類的一個實體,并且我希望該類具有一個顯式的 Eval 實體化。這里的目的是獲得一個避免歧義的成員函式指標:
auto eval_ptr = &A<int>::Eval;
uj5u.com熱心網友回復:
歧義與模板實體化無關,它是由Eval模板函式引起的。
&A<int>::Eval不指向函式,它指向模板。并且沒有“指向模板的指標”這樣的型別。
如果您想要指向 的指標A<int>::Eval,則還需要指定D。
auto eval_ptr = &A<int>::Eval<int>; 例如,作業得很好。
附錄:在語法意義上確實存在指向模板的指標,但沒有任何型別的物件可以擁有其中之一。他們必須立即澆鑄/衰減到一個特定的過載才能被使用,因為要存盤在一個不來這里發揮作用auto。
例如:以下內容很好,因為顯然只有一個“版本”Eval可以表示:
void bar(void (A<int>::*arg)(int&)) {}
void foo() {
bar(&A<int>::Eval);
}
uj5u.com熱心網友回復:
非常簡單的解決方案是指定兩個模板引數:
template <typename T>
class A
{
private:
T a;
public:
A(T &a) : a_(a) {}
template <typename D>
void Eval(D &arg)
{
arg =1;
}
};
int main()
{
auto p = &A<int>::Eval<int>;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/329577.html
上一篇:我如何撰寫一個程式來查找陣列中的最小差異(未排序)c 只是nlogn時間復雜度
下一篇:Elasticsearch崩潰了
