Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板和模糊函数调用_C++_Templates_Ambiguous Call - Fatal编程技术网

C++ C++;模板和模糊函数调用

C++ C++;模板和模糊函数调用,c++,templates,ambiguous-call,C++,Templates,Ambiguous Call,有些我无法控制的代码有许多重载函数,它们接受不同的类型 i、 e 我有一个模板函数,理想情况下,它可以接受这些类型中的任何一种,并将其传递给正确的setValue函数 template <class T> do_something(T value) { ... setValue(value); 我能做些什么来解决这个问题,而不必像setValue的编写者那样复制和粘贴每种类型的代码?我没有以下问题: void setValue(int a) { } void se

有些我无法控制的代码有许多重载函数,它们接受不同的类型

i、 e

我有一个模板函数,理想情况下,它可以接受这些类型中的任何一种,并将其传递给正确的setValue函数

template <class T>
do_something(T value) {
    ...
    setValue(value);

我能做些什么来解决这个问题,而不必像setValue的编写者那样复制和粘贴每种类型的代码?

我没有以下问题:

void setValue(int a)
{
}

void setValue(std::string a)
{
}

void setValue(bool a)
{
}

template <class T>
void func(T value)
{
    setValue(value);
}

int main()
{
    func(5);
}
void设置值(int a)
{
}
void setValue(标准::字符串a)
{
}
无效设置值(布尔值a)
{
}
模板
无效函数(T值)
{
设置值(值);
}
int main()
{
func(5);
}

以下是我的跑步记录:

通过定义自己的设置值,并精确匹配并转发到正确的重载

void setValue(int i) { setValue(static_cast<double>(i)) }
void setValue(inti){setValue(static_cast(i))}
或者(如果您有许多相同类型的“setValue”函数),您可以帮助编译器选择要使用的重载,如下所示:

void setValue(char a);
void setValue(double a);

template <typename T>
struct TypeToUseFor
{
    typedef T type;
};

template <>
struct TypeToUseFor<int>
{
    typedef double type;
};

template <class T>
void func(T value)
{
    setValue(static_cast<typename TypeToUseFor<T>::type>(value));
//    setValue(value);
}

int main() {
    func(0);   // int -> ?
    func('0'); // exact match
    func(0.0); // exect match
    func(0.f); // float -> double

    return 0;
}
void设置值(字符a);
无效设置值(双a);
模板
结构类型为
{
T型;
};
模板
结构类型为
{
typedef双字型;
};
模板
无效函数(T值)
{
设置值(静态_转换(值));
//设置值(值);
}
int main(){
func(0);//int->?
func('0');//精确匹配
func(0.0);//执行匹配
func(0.f);//浮点->双精度
返回0;
}

您试图实例化模板的类型是什么?很可能是重载函数中没有完全匹配的类型,但您尝试了多个有效的conversionId
::setValue((t)value)?例如,
char
可能会变得模棱两可:)@jcoder您完全正确,非常感谢。@K06一个糟糕的建议。您至少可以建议静态_cast(值)是的,此逻辑没有问题。我的问题似乎有点不同。
void setValue(int i) { setValue(static_cast<double>(i)) }
void setValue(char a);
void setValue(double a);

template <typename T>
struct TypeToUseFor
{
    typedef T type;
};

template <>
struct TypeToUseFor<int>
{
    typedef double type;
};

template <class T>
void func(T value)
{
    setValue(static_cast<typename TypeToUseFor<T>::type>(value));
//    setValue(value);
}

int main() {
    func(0);   // int -> ?
    func('0'); // exact match
    func(0.0); // exect match
    func(0.f); // float -> double

    return 0;
}