C ++部分排序失败,有2个模板参数

时间:2010-06-21 16:58:12

标签: c++ templates gcc

因此,给出以下具有部分特化的模板函数

template<typename T>
void foo(vector<T> &in) {
    cout << "vector" << endl;
}

template<typename T>
void foo(T &in) {
    cout << "scalar" << endl;
}

int main(int arc, char *argv[]) {
    vector<double> a;
    double b;

    foo(a);
    foo(b);
    return 0;
}

使用g ++ 3.4.6进行编译没有问题,并获得预期的输出:

vector
scalar

现在,如果我添加第二个模板参数:

template<class U, typename T>
void foo2(vector<T> &in) {
    U a;
    cout << "vector" << endl;
}

template<class U, typename T>
void foo2(T &in) {
    U a;
    cout << "scalar" << endl;
}

并使用以下内容进行调用:

int main(int arc, char *argv[]) {
    vector<double> a;
    double b;

    foo2<double>(a);
    foo2<double>(b);
    return 0;
}

当我尝试编译它时,GCC 3.4.6给出了一个模糊的过载错误。

error: call of overloaded `foo2(std::vector<double, std::allocator<double> >&)' is ambiguous
note: candidates are: void foo2(std::vector<T, std::allocator<_T2> >&) [with U = double, T = double]
note:                 void foo2(T&) [with U = double, T = std::vector<double, std::allocator<double> >]

我无法看到第二个模板参数现在如何使重载变得模糊。据我所知,矢量版本应该更专业。这只是3.4中的一个错误吗?有解决方法吗?

对于记录,代码在gcc 4.1中工作没有问题。不幸的是,我们的一些工具仍然与3.4相关联,因此升级不是解决方案。

感谢。

1 个答案:

答案 0 :(得分:2)

这似乎与最新版本编译器中this defect fixed有关。解决方法是显式设置模板的所有参数或改为使用仿函数:

template<typename U>
struct foo2 {
    template<typename T>
    void operator()( std::vector<T> &in ) {
        U a;
        cout << "vector" << endl;
    }
    template<typename T>
    void operator()( T& in ) {
        U a;
        cout << "scalar" << endl;
    }
};

int main(int arc, char *argv[]) {
    vector<double> a;
    double b;

    foo2<double>()(a);
    foo2<double>()(b);
    return 0;
}