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

Compile error with default argument of function with static template function

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

//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 的静态成员,它会编译。

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

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

编译器无法通过查看分配给 return 值的变量类型来推断模板参数。


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

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

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"));
};