我遇到了一個棘手的問題,我已經為此作業了幾個小時,但找不到原因和解決方案。希望有人幫助我。
我必須演示在另一個函式中呼叫的函式(請參閱 seminar.cpp 中的注釋)
下面是檔案(我把它分成頭檔案和代碼檔案)
主.cpp
#include <iostream>
#include <functional>
#include "seminar.h"
int main()
{
Tom::Car::Car car;
Nor::Driving drivingnow;
std::vector<uint8_t> X = car.road(drivingnow);
for(int i = 0 ; i < X.size() ; i ){
std::cout<<unsigned(X[i])<<" ";
}
return 0;
}
研討會.h
#pragma once
#include "dist.h"
#include <vector>
#include <bits/stdc .h>
namespace Tom
{
namespace Car
{
class Car
{
public:
std::vector<uint8_t> road(Nor::Driving &driving);
};
} // namespace Car
} // namespace Tom
研討會.cpp
#include "seminar.h"
#include <algorithm>
#include <functional>
namespace Tom
{
namespace Car
{
std::vector<uint8_t> drive(Nor::Range &range)
{
std::vector<uint8_t> s;
s.push_back(range.z);
s.push_back(range.zz);
return s;
}
template <typename T, typename B, typename L>
std::vector<uint8_t> Content(T Sec, B Byte, L Func)
{
Nor::Range Rom;
std::vector<uint8_t> z = Func(Rom);
return z;
}
std::vector<uint8_t> Car::road(Nor::Driving &driving)
{
std::function<std::vector<uint8_t>(Nor::Range &)> Func = &drive;
return Content(driving, 1, Func); // passing drive function into content
}
} // namespace Car
} // namespace Tom
距離
namespace Nor
{
class Driving{
public:
int x = 1;
};
class Range{
public:
int z = 50;
int zz = 100;
};
}
上面的代碼和檔案結構作業正常并給我正確的預期輸出即50 100
Live here
現在我想做更多的分離,即我希望 drive函式的實作移動到另一個檔案中,即type.cpp
型別.cpp
#include <algorithm>
#include "seminar.h"
#include <functional>
namespace Tom
{
namespace Car
{
std::vector<uint8_t> Car::drive(Nor::Range &range)
{
std::vector<uint8_t> s;
s.push_back(range.z);
return s;
}
} // namespace Car
} // namespace Tom
研討會.h
#pragma once
#include "dist.h"
#include <vector>
#include <bits/stdc .h>
namespace Tom
{
namespace Car
{
class Car
{
public:
std::vector<uint8_t> road(Nor::Driving &driving);
std::vector<uint8_t> drive(Nor::Range &range);
};
} // namespace Car
} // namespace Tom
研討會.cpp
#include "seminar.h"
#include <algorithm>
#include <functional>
namespace Tom
{
namespace Car
{
template <typename T, typename B, typename L>
std::vector<uint8_t> Content(T Sec, B Byte, L Func)
{
Nor::Range Rom;
std::vector<uint8_t> z = Func(Rom);
return z;
}
std::vector<uint8_t> Car::road(Nor::Driving &driving)
{
std::function<std::vector<uint8_t>(Nor::Range &)> Func = &drive;
return Content(driving, 1, Func);
}
} // namespace Car
} // namespace Tom
住 在這里 完成此操作后,我收到以下錯誤:
seminar.cpp: In member function ‘std::vector<unsigned char> Tom::Car::Car::road(Nor::Driving&)’:
seminar.cpp:22:71: error: ISO C forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say ‘&Tom::Car::Car::drive’ [-fpermissive]
22 | std::function<std::vector<uint8_t>(Nor::Range &)> Func = &drive;
| ^~~~~
seminar.cpp:22:71: error: conversion from ‘std::vector (Tom::Car::Car::*)(Nor::Range&)’ to non-scalar type ‘std::function(Nor::Range&)>’ requested
參考這個答案
我試過這種方式:
std::function<std::vector<uint8_t>(Nor::Range)> f = std::bind(&Car::drive, this);
并收到此錯誤:
/usr/include/c /9/functional:775:7: error: static assertion failed: Wrong number of arguments for pointer-to-member
774 | static_assert(_Varargs::value
| ~~~~~
775 | ? sizeof...(_BoundArgs) >= _Arity::value 1
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
776 | : sizeof...(_BoundArgs) == _Arity::value 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
seminar.cpp: In member function ‘std::vector<unsigned char> Tom::Car::Car::road(Nor::Driving&)’:
seminar.cpp:23:73: error: conversion from ‘std::_Bind_helper (Tom::Car::Car::*)(Nor::Range&), Tom::Car::Car*>::type’ {aka ‘std::_Bind (Tom::Car::Car::*(Tom::Car::Car*))(Nor::Range&)>’} to non-scalar type ‘std::function(Nor::Range)>’ requested
23 | std::function<std::vector<uint8_t>(Nor::Range)> f = std::bind(&Car::drive, this);
| ~~~~~~~~~^~~~~~~~~~~~~~~~~~~
seminar.cpp:25:40: error: ‘Func’ was not declared in this scope
25 | return Content(driving, 1, Func);
現場看這里
我不知道我在移動函式的實作時做錯了什么,drive有人可以幫助實作正確的方法嗎?
注意:如果解決方案使用另一種方式傳遞函式,即不使用 std::function. 謝謝
uj5u.com熱心網友回復:
在 seminar.cpp 中,這里:
std::function<std::vector<uint8_t>(Nor::Range &)> Func = &drive;
drive是一個成員函式。它需要this呼叫指標。
您可以通過將其包裝在 lambda 中輕松解決此問題:
std::function<std::vector<uint8_t>(Nor::Range &)> Func = [this](Nor::Range & r) {
return this->drive(r);
};
如果您更喜歡std::bind您嘗試過的方法,則需要一個Nor::Range&引數占位符:
std::function<std::vector<uint8_t>(Nor::Range &)> Func = std::bind(&Car::drive, this, std::placeholders::_1);
另外,你真的根本不需要std::function,因為它是一個區域變數,你可以立即傳遞給另一個函式,所以只需使用auto它(或直接傳遞它而無需中間變數):
auto Func = [this](Nor::Range & r) {
return this->drive(r);
};
uj5u.com熱心網友回復:
非靜態成員函式指標應該這樣初始化:
return_type (class_name::*pointer_name)(arg_types...) = &class_name::function_name;
他們應該這樣稱呼:
(instance_name.*pointer_name)(args...);
它們只能被呼叫,不能賦值給function物件。
該bind函式不回傳function物件,因此也不能將其分配給function物件。
您可以嘗試auto:
auto Func = std::bind(&Car::drive, this, std::placeholders::_1);
允許將placeholderargNor::Range &range傳遞給函式Car::drive。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/537167.html
下一篇:如何使用抽象類右值參考成員?
