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