【发布时间】:2020-03-10 20:54:36
【问题描述】:
在探索 RxCpp 库时,我遇到了以下我无法解释的示例。
auto ints = rxcpp::observable<>::create(
[](rxcpp::subscriber<int> s){
s.on_next(1);
s.on_next(2);
s.on_completed();
});
库中有两个observable类的声明:
template<class T, class SourceOperator>
class observable
: public observable_base<T>
{
// ...
};
template<>
class observable<void, void>
{
// ...
};
我无法理解的是编译器如何设法接受rxcpp::observable<>. 片段。除了void,void之外,对于不同的类型,observable 可能有很多明确的特化。
问题是编译器如何解释这段代码中的空尖括号:rxcpp::observable<>.
我在observable 类中没有看到默认模板参数,也没有可以解释这一点的可变参数模板参数。
然后我认为它与显式模板专业化有某种关系,并试图在一个孤立的程序中重现它,例如这样
namespace isolated {
template<class T>
class Test {
public:
static void say() {
cout << "I am generic" << endl;
}
};
template<>
class Test<int> {
public:
static void say() {
cout << "I am integer" << endl;
}
};
}
int main() {
isolated::Test<>::say(); // ERROR: too few arguments for class template.....
}
但是,即使只有一个显式特化,它也无法编译。
【问题讨论】:
-
看起来您缺少一些东西。
rxcpp::observable<>可以工作的唯一方法是是否有默认模板参数。看源码看看有没有observable这样的前向声明template<class T = something, class SourceOperator = something_else> class observable -
@JerryJeremiah 他说的是调用站点 (sn-p 1),而不是 sn-p 2 的专业化。
-
查找类模板的声明。它可以有默认的模板参数。例如。
template<class T = void, class SourceOperator = void> class observable;