我想使用用静态成员函数初始化的默认参数。我有以下示例:
//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的静态成员,则编译。
答案 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"));
};