【问题标题】:Default template parameters: Why does the compiler complain about not specifying template argument?默认模板参数:为什么编译器抱怨没有指定模板参数?
【发布时间】:2012-06-29 04:33:25
【问题描述】:

我有这个代码:

struct A{};

template<class T = A>
struct B {
    void foo() {}
};

B b; //Error: missing template arguments before 'b'
     //Error: expected ';' before 'b'
     //More errors
b.foo()

如果我将foo() 设为具有相同模板“签名”的模板函数,编译器不会抱怨未指定模板参数:

struct A {};

struct B {
    template<class T = A>
    void foo() {}
};

B b; //OK
b.foo()

那么为什么我需要为具有默认参数的模板类指定参数,而不是为模板函数指定参数?有没有我遗漏的一些微妙之处?

原因肯定是模板参数推导失败。但我想知道为什么。

【问题讨论】:

标签: c++ templates default-parameters template-argument-deduction


【解决方案1】:

正确的语法是这样的 (demo):

B<> b; 

默认参数A 假定用于类模板B&lt;&gt; 部分告诉编译器B 是一个类模板,并要求它采用默认参数作为模板参数。

【讨论】:

  • 我明白了。但是为什么没有这个模板函数可以工作:b.foo&lt;&gt;()
  • 我的错。应该提到 g++ 4.7.0,它支持函数的默认模板参数。所以上面的代码肯定有效。尝试使用 g++ 4.7.0 运行。
  • @Nawaz: Yes it does;默认参数需要 C++11,但函数调用很好。可以在没有函数参数列表的情况下调用函数模板;允许重载决议同时考虑模板特化和非模板重载。
  • @MikeSeymour:是的。我意识到 C++03 不允许函数模板的默认参数。不过,C++11 可以。
  • 我不需要这样做的任何理由:b.foo&lt;&gt;()?是不是因为这两种情况的扣除过程不同?
【解决方案2】:

正如 Nawaz 已经提到的,正确的语法是:

B<> b;

原因是B 是模板,B&lt;&gt; 是模板的实例化,默认参数A。但是您需要 &lt;&gt; 来区分何时需要实例化。

【讨论】:

    【解决方案3】:

    因为你不得不说B是一个模板:

    B<> b;
    

    即使您不想指定任何参数。

    【讨论】:

    • 实际上你需要&lt;&gt; 告诉编译器你不需要模板,而是使用默认参数的模板的实例化。不过语法是正确的。
    猜你喜欢
    • 2011-09-06
    • 1970-01-01
    • 2015-10-08
    • 2011-10-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2012-08-07
    相关资源
    最近更新 更多