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

标签 c++ templates template-specialization

考虑以下我的代码的简化版本。 我有一个模板类A ,模板函数Fill ,以及用于处理基本类型(例如 int )的函数的专门化或char ,以及另一个可以使用的专业 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/

相关文章:

javascript - OpenUI5/SAPUI5 中表达式绑定(bind)中的函数调用

c++ - 如何专门化模板子类?

c++ - Clang 不会编译 gcc 会编译的模板特化

c++ - 混合 C/C++ 库

c++ - ComputeLibrary 数据类型模板

c++ - 如何将模板化固定字符串传递给另一个类的构造函数的重载

git - 如何在git中基于同一个模板管理多个项目?

c++ - 我可以使用别名模板专门化一个类模板吗?

c++ - Raspberry Pi C++ 段错误

c++依赖注入(inject)来测试类系统调用的类