2010-08-19 77 views
3

为什么不编译此代码?构造函数中的C++模板参数

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:命名的构造函数用法是不能接受我。我想为RAII使用这个类。 这样做的唯一方法是const A& a = A::MakeA(t),但它很丑!

+1

简要答案是“你不能”。类模板根本就不能这样工作。我会把它留给别人来试图解释理由。 – 2010-08-19 11:15:08

回答

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); 
}; 
+0

另一个'间接'技术 – Chubsdad 2010-08-19 11:24:26

+0

thanx的例子,我会试着找到另一种方式 – f0b0s 2010-08-19 11:32:13