【问题标题】:Double templated function overload fails双模板函数重载失败
【发布时间】:2023-04-08 05:42:01
【问题描述】:

我有一个模板类,有各种模板功能。其中一个需要重载(几次)。

基本上 - 如果我的类不是模板,这些将是我的函数:

class OtherClass
{
public:
    template<class T> T foo(T &t, const std::string &trash);
};

template<class T>
T OtherClass::foo(T &t, const std::string &trash)
{
    return t; //...
}

template<>
std::wstring OtherClass::foo<std::wstring>(std::wstring &w, const std::string &trash)
{
    return w; //...
}

这个:

int main(...)
{
    int i = 0;
    std::wstring w;

    OtherClass o;
    i = o.foo(i, std::string(""));
    w = o.foo(w, std::string(""));
}

我的模板类看起来像:

template<class MStr>
class OtherClass
{
public:
    template<class TVal> TVal foo(TVal &t, const MStr &trash);
};

//Which leads to the function definition

template<class MStr>
template<class TVal>
TVal OtherClass<MStr>::foo(TVal &t, const MStr &trash)
{
    return t; //...
}

我想要的……(以int为例)

template<class MStr>
template<>
int OtherClass<MStr>::foo<int>(int &t, const MStr &trash)
{
    return t; //...
}

欢迎来到
C2768: illegal use of explicit template arguments

C2244: unable to match function definition

1>...\test\main.cpp(74): error C2768: 'OtherClass<MStr>::foo' : illegal use of explicit template arguments
1>...\test\main.cpp(74): error C2768: 'OtherClass<MStr>::foo' : illegal use of explicit template arguments
1>...\test\main.cpp(74): error C2244: 'OtherClass<MStr>::foo' : unable to match function definition to an existing declaration
1>          definition
1>          'int OtherClass<MStr>::foo<int>(int &,const MStr &)'
1>          existing declarations
1>          'TVal OtherClass<MStr>::foo(TVal &,const MStr &)'
1>
1>Build FAILED.

我一直在测试,并在 Google 和 Stackoverflow 中寻找几个小时...到目前为止,似乎不适用于我的最佳答案/问题是 this.

问:有没有人可以为我指出正确的方向,或者有解决方法来解决这个问题?

【问题讨论】:

    标签: c++ visual-studio-2010 templates compiler-errors c++03


    【解决方案1】:

    回避这个问题的一种方法是将int 版本声明为重载而不是模板特化:

    template<class MStr>
    class OtherClass
    {
    public:
        template<class TVal> TVal foo(TVal &t, const MStr &trash);
        int foo(int &t, const MStr &trash);
    };
    

    然后定义为:

    template<class MStr>
    int OtherClass<MStr>::foo(int &t, const MStr &trash)
    {
        return t; //...
    }
    

    如果您有很多重载情况,这并不是特别漂亮,但它可能优于任何其他解决方案。

    【讨论】:

    • 是的...我已经用bool 做到了,它并不漂亮,但我想我会继续这样...
    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 2019-10-22
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2017-05-04
    • 2011-01-11
    相关资源
    最近更新 更多