为什么这段代码不能编译?
template <class T>
class A
{
public:
A(T t) : t_(t) {}
private:
T t_;
};
int main()
{
A a(5.5);
// A<double> a(5.5); // that's what i don't want to do
}
我希望模板参数是隐式的。
就像这个例子一样:
template<class T>
T Foo(T t) { return t; }
// usage:
Foo(5.5);
UPDATE :我不接受named-constructor idiom。我想把这个类用于RAII。
唯一的方法是const A& a = A::MakeA(t)
,但这很难看!
答案 0 :(得分:9)
由于您必须命名变量的类型(C ++ 03无法推断变量的类型),您只能这样做:
A<double> a(5.5); // that's what i don't want to do
当您不需要创建类型的变量但希望将其传递给其他函数时,情况会更容易一些。在这种情况下,您可以定义辅助“构造函数”(请参阅std::make_pair
):
template <class T>
A<T> make_a(T t) { return A<T>(t); }
然后像这样使用它:
another_function(make_a(1.1));
在C ++ 0x中,你甚至可以做到
auto a(make_a(5.5));
定义变量a
。
但是,从构造函数中推断A
的参数通常是不可能的,因为您无法分辨哪些特化具有给定类型的转换构造函数。想象一下,有一个专业化
template <>
struct A<void>
{
A(double);
};