std::initializer_list 和 std::thread
std::initializer_list with std::thread
myNameSpace::functionName(this, {"abc", "abc1"}); // working fine
工作正常,但是
std::thread(myNameSpace::functionName<ClassName>(this, {"abc", "abc1"}));
//error: invalid use of void expression.
请告诉我我在这里缺少什么。或者怎么做。
namespace myNameSpace {
template<typename T>
void functionName(T* cm, std::initializer_list<std::string_view> args) { ... }
}
首先,这不是启动线程的方式。您正在调用它,并将结果作为参数传递以启动线程。但是,void
不是启动线程的有效参数,在任何意义上它也不是任何有用的表达式。
你会写这样的东西:
std::thread(&myNameSpace::functionName<ClassName>, this, {"abc", "abc1"});
你的下一个问题是,编译器在语言中没有任何工具可以推断出你所说的 {"abc", "abc1"}
的意思。通过对 functionName
的直接函数调用,它可以解决问题,因为函数调用机制知道候选重载是什么,但是 "broken down" 构造并非如此。
It's possible to fix that通过指定类型:
std::thread(&myNameSpace::functionName<ClassName>, this, std::initializer_list<std::string_view>{"abc", "abc1"});
但是,我建议您只传递(并接受)std::vector<std::string_view>
。它会更容易,更简单。
std::thread
收到一个可调用的第一个参数,你发送它 void
(myNameSpace::functionName
的调用结果)。
你需要做的是
std::thread(myNameSpace::functionName<ClassName>, this, std::initializer_list<std::string_view>({"abc", "abc1"})));
请注意,需要显式转换为 std::initializer_list
,因为 std::initializer_list
是不可扣除的类型。
对于线程,您需要在参数列表中提供函数引用和参数参数,如下所示:
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
在您的情况下,您必须提供如下参数:
std::thread(myNameSpace::functionName<ClassName>,this, std::initializer_list<std::string_view>({"abc", "abc1"}));
myNameSpace::functionName(this, {"abc", "abc1"}); // working fine
工作正常,但是
std::thread(myNameSpace::functionName<ClassName>(this, {"abc", "abc1"}));
//error: invalid use of void expression.
请告诉我我在这里缺少什么。或者怎么做。
namespace myNameSpace {
template<typename T>
void functionName(T* cm, std::initializer_list<std::string_view> args) { ... }
}
首先,这不是启动线程的方式。您正在调用它,并将结果作为参数传递以启动线程。但是,void
不是启动线程的有效参数,在任何意义上它也不是任何有用的表达式。
你会写这样的东西:
std::thread(&myNameSpace::functionName<ClassName>, this, {"abc", "abc1"});
你的下一个问题是,编译器在语言中没有任何工具可以推断出你所说的 {"abc", "abc1"}
的意思。通过对 functionName
的直接函数调用,它可以解决问题,因为函数调用机制知道候选重载是什么,但是 "broken down" 构造并非如此。
It's possible to fix that通过指定类型:
std::thread(&myNameSpace::functionName<ClassName>, this, std::initializer_list<std::string_view>{"abc", "abc1"});
但是,我建议您只传递(并接受)std::vector<std::string_view>
。它会更容易,更简单。
std::thread
收到一个可调用的第一个参数,你发送它 void
(myNameSpace::functionName
的调用结果)。
你需要做的是
std::thread(myNameSpace::functionName<ClassName>, this, std::initializer_list<std::string_view>({"abc", "abc1"})));
请注意,需要显式转换为 std::initializer_list
,因为 std::initializer_list
是不可扣除的类型。
对于线程,您需要在参数列表中提供函数引用和参数参数,如下所示:
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
在您的情况下,您必须提供如下参数:
std::thread(myNameSpace::functionName<ClassName>,this, std::initializer_list<std::string_view>({"abc", "abc1"}));