標籤:

關於c++模板推導失敗,這是編譯器的bug嗎?

我想實現一個類似可變參數的機制。 但是不能使用可變參數 va_list. 也沒有c++11的可變參數模板。

所以自己想了個辦法封裝了一個Indexes類,用indexes成員的值來替代可變參數.具體實現可以參考下面(我用的編譯器是g++4.8 在vs2008上也是一樣的)。

但是我發現了一個詭異的bug。 調用這個介面的時候普通函數推導不成功, 可是改成等價的模板函數後卻是OK的。

我實在是想不出其中的原因,感覺我的使用是沒有問題的。大家能幫忙分析下嗎, 感謝

```

class A;

class Indexes

{

public:

Indexes() : i1(-1), i2(-1)

{}

template &

void dispatch_single_index_to_memfunc(A *ptr, void (A::*func)(const Arg arg, int i), const Arg arg)

{

if (i1 != -1)

(ptr-&>*func)(arg, i1);

if (i2 != -1)

(ptr-&>*func)(arg, i2);

}

private:

int i1;

int i2;

//int i3, i4, ...

};

class A

{

//編譯失敗

//In member function 『void A::do_something(const char*, Indexes)』:

//error: no matching function for call to 『Indexes::dispatch_single_index_to_memfunc(A* const, void (A::*)(const char*, int), const char*) const』

//indexes.dispatch_single_index_to_memfunc(this, A::do_someting_with_single_index, arg);

// ^

//note: candidate is:

//template& void Indexes::dispatch_single_index_to_memfunc(A*, void (A::*)(const Arg, int), const Arg)

//void dispatch_single_index_to_memfunc(A *ptr, void (A::*func)(const Arg arg, int i), const Arg arg)

// ^

//main.cpp:8:10: note: template argument deduction/substitution failed:

//main.cpp:27:94: note: mismatched types 『const Arg』 and 『const char*』

// indexes.dispatch_single_index_to_memfunc(this, A::do_someting_with_single_index, arg);

#if 0

void do_something(const char* arg, const Indexes indexes)

{

indexes.dispatch_single_index_to_memfunc(this, A::do_someting_with_single_index, arg);

}

#endif

//編譯成功

template &

void do_someting(const CharT *arg, const Indexes indexes)

{

indexes.dispatch_single_index_to_memfunc(this, A::do_someting_with_single_index, arg);

}

private:

void do_someting_with_single_index(const char* arg, int i)

{

}

};

int main()

{

}

```


首先,譴責所有用手機問編程題的知乎用戶。因為知乎的代碼編輯框只有PC能用。我覺得以後我要舉報所有不用代碼編輯框貼代碼、和用手機拍照的所有編程題。

其次,這個代碼的錯誤在於:

  1. dispatch_single_index_to_memfunc沒有const
  2. do_someting_with_single_index函數的const char*參數明顯不能被dispatch_single_index_to_memfunc的func參數當成const Arg用


具體原因 @vczh 輪子哥已經回答了。

我補充個周邊。

1. 碰到問題先懷疑編譯器是不對的。

2. 你貼的錯誤信息寫得這麼明顯了,你的函數簽名和你模板里寫得不一樣你為什麼不看?


謝邀,我是財務專業的,真心不懂這個。


推薦閱讀:

《深度探索c++對象模型》,C語言有沒有類似的書,講解C語言低層細節及編譯器所做工作?
計算機語言是有局限性的么?
如何理解c++中的引用摺疊?
extern C裡面能有C++代碼嗎?
該如何設計實現一個telnet bbs?

TAG:CC | 模板C |