gpt4 book ai didi

c++ - 如何让编译器使用正确的模板特化?

转载 作者:搜寻专家 更新时间:2023-10-31 00:45:50 24 4
gpt4 key购买 nike

考虑我的代码的以下简化版本。我有一个模板类 A , 一个模板函数 Fill ,以及处理基本类型的函数的专门化,如 intchar ,以及另一个与 A 合作的专业:

#include <sstream>
#include <string>
#include <iostream>

template<size_t C>
class A
{
public:
A & operator=(std::string v) {
data[0] ='a';
return *this;
}
char data[C];
};

template<typename T> T Fill(std::string value, T default_value);

// Specialization for A<C>
template<size_t C>
A<C> Fill(std::string value, A<C> default_value)
{
if (value.empty())
return default_value;
A<C> result;
result = value;
return result;
}

// Specialization for int, double, char, etc
template<typename T>
T Fill(std::string value, T default_value)
{
if (value.empty())
return default_value;

T result;
std::istringstream(value) >> result;
return result;
}

void main()
{
int abc = Fill(/*Get a string somehow*/"123", 0); // OK

A<10> def;
def = std::string("111");
A<10> a;
a = Fill(/*Get a string somehow*/"abc", def); // OK
}

虽然我很惊讶编译器设法将参数与正确的模板特化相匹配,但效果很好。

问题来自一些typedef这简化了 A<x> 的使用.这是一个简化版本:

typedef A<12> A12;
...
A<12> def12;
def12 = std::string("12");

A12 a12;
a12 = Fill(/*Get a string somehow*/"xyz", def12); // Not OK !

编译器没有检测到 A12 类型实际上是 A<12>并使用了错误的函数特化,该函数无法编译,因为 istringstream 无法使用 o perator>> 进行解析进入 A .

如何让它使用正确的模板特化?

最佳答案

模板特化不是通过您将返回值分配给的位置来推断的。您必须显式实例化正确的版本:

a12 = Fill<A<12> >("xyz", def);

(或者你需要的任何东西......)

关于c++ - 如何让编译器使用正确的模板特化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6061211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com