假設我們有一個原始的C風格字符串"test"
。我們可以宣佈這樣的功能:C++自動構造函數調用
void printText(std::string textToPrint){
std::cout << textToPrint << "\n";
}
,我們可以稱之爲以如下方式:
printText("test");
,這應該是完全正常的,因爲參數是一個對象,而不是一個參考,所以應該在調用函數printText()時創建類似std::string("test")
的臨時對象。
現在鑑於這種情況,我有以下模板:
template <typename T>
T checkMe(Proxy<T> arg){
std::cout << arg() << std::endl;
return arg();
}
其中Proxy
類的聲明如下:
template <typename T>
class Proxy{
public:
Proxy(std::function<T&()> caller);
Proxy(std::shared_ptr<T> dataPtr);
T& operator()();
private:
std::function<T&()> m_functional;
std::shared_ptr<T> m_data;
};
它的目的是使某些功能有兩個對象調用類型: 一個是shared_ptr
到數據,另一個是功能對象,返回這種類型的數據。
現在當我想調用函數checkMe
發生錯誤時,我不知道爲什麼會出現以及如何解決它。有一兩件事是:
getMe(std::make_shared<int>(255));
而這在我看來應該是完全正常的,作爲代理的構造函數接受shared_ptr的作爲參數,並在此基礎上創建自己。但是這給編譯器的推導錯誤。而當我打電話這樣的功能:
getMe<int>(std::make_shared<int>(255));
現在好了。我不知道爲什麼編譯器不能自行推斷它的類型。
第二種情況與官能對象調用它:
getMe<int>(std::bind(getNumberMult,5,6));
凡getNumberMult
定義如下:發生
int xy;
int& getNumberMult(int x, int y){
return xy = x*y;
}
這裏轉換錯誤。有人能指出是否有可能以及如何實現給定代碼的期望行爲,並解釋我對該機制的理解有什麼問題?我想利用這個代碼如下:
getMe(std::make_shared<int>(300));
getMe(std::bind(getNumberMult, 6, 7));
編譯器錯誤:
在使用
getMe<int>(std::bind(getNumberMult, 5, 6));
path/to/file:36: error: C2664: 'T getMe<int>(DataProxy<T>)' : cannot convert argument 1 from 'std::_Bind<true,int &,int &(__cdecl *const)(int,int),int,int>' to 'DataProxy<int>'
with
[
T=int
]
實際編譯器消息的副本是強制性的。 –
http://stackoverflow.com/search?q=%5Bc%2B%2B%5D+non-deducible+context –