關於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能用。我覺得以後我要舉報所有不用代碼編輯框貼代碼、和用手機拍照的所有編程題。
其次,這個代碼的錯誤在於:
- dispatch_single_index_to_memfunc沒有const
- 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?