class C {
public:
C() {}
};
template<typename T>
void func(T f) {}
int main() {
func(C);
}
如何修复编译错误“2.cpp:9:15:错误:在'之前预期的primary-expression')'令牌 FUNC(C);?“
传递类作为参数似乎很荒谬,但我想编译类似线程的函数,因为“thread(C)”工作正常:
#include <thread>
class C {
public:
C() {}
};
template<typename T>
void func(T f) {}
int main() {
std::thread(C);
}
答案 0 :(得分:9)
不幸的是,C ++中的one cannot take address of a constructor。意思是,你不能简单地把#34;一个指向构造函数的指针&#34;并将其用作函子(就像你使用自由函数或成员函数一样)。
你实际上不能通过课程&#34;作为一个参数,因为C ++核心没有反射,如果你得到一个类&#34;在运行时,你不能用它做任何事情。你只能通过一个班级&#34;作为模板参数。
但是,你可以做的只是使用lambda函数,它将调用相应的构造函数:
class C {
public:
C() {}
};
template<typename T>
void func(T f) {
auto c_instance = f();
}
int main() {
func([](){ return C(); });
}
请注意,您仍然没有在运行时传递任何内容 - lambda [](){ return C(); }
的返回类型在编译时是已知的,因此auto c_instance
的类型在编译时也是已知的。
但是,我认为如果您不需要将C
的任何其他工厂传递到func
,只需在func
内创建实例就会更清楚:
class C {
public:
C() {}
};
template<typename T>
void func() {
T c_instance;
}
int main() {
func<C>();
}
std::thread(c);
std::thread(C);
不是函数调用。 std::thread
是一种类型。因此,它声明了一个名为C
的局部变量。使用
auto a = std::thread(C);
应该产生类似的编译错误。
答案 1 :(得分:-2)
为了调用构造函数,它必须是公共的,所以:
class C {
public:
C() {}
};
template<typename T>
void func(T f) {}
int main() {
C* instanceC = new C();
func(instanceC);
delete instanceC;
}
C是类型,函数中的参数f需要T的实例。