使用静态模板函数使用函数的默认参数编译错误

时间:2015-01-14 07:35:05

标签: c++ visual-studio-2010 templates

我想使用用静态成员函数初始化的默认参数。我有以下示例:

//A.h
#include <string>
class A
{
 public:
   template<class T>
   static T& Get(const std::wstring&);
};

//Util.h
#include "A.h"
#include <string>

class B
{
 public:
  void f(
    double d,
    double c = A::Get<double>(L"test"));
}

//main.cpp
#include "Util.h"
int main()
{
    B b;
    b.f(5);
}

我得到的错误是

util.h(7): error C2783: 'T &A::Get(const std::wstring &)' : could not deduce template argument for 'T'.

我无法理解这不能编译的原因。

编辑: 我正在使用visual studio 2010 sp1。而且似乎这是编译器错误。如果我将Get改为全局而不是A的静态成员,则编译。

2 个答案:

答案 0 :(得分:4)

函数模板的签名中没有任何内容允许编译器推导出模板类型,因此您需要明确。函数f的默认参数应为:

double c = A::Get<double>(L"test")

编译器不能通过查看赋值给返回值的变量类型来推断出模板参数。


template <typename T>
T fn1(int a); // Can not deduce template type

template <typename T>
T fn2(T b); // It is possible to deduce template type from function arguments

答案 1 :(得分:0)

您已经提到过您正在使用VS2010。有了这个,我得到你做的同样的错误,即使代码是完全合法的并且应该编译(例如,它与gcc does)。所以它是一个编译器错误。我通过为静态成员函数包含一个全局包装器来解决它:

template <class T>
T& GlobalGet(const std::wstring& x)
{
  return A::Get<T>(x);
}

class B
{
 public:
  void f(
    double d,
    double c = GlobalGet<double>(L"test"));
};