2

使用 MSVC 2010,我得到以下行为:

template <class T> class Boogy
{
public:
    void Fn( T in )
    {
    }

    void Fn2( const T& in)
    {
    }
};

template <> void Boogy<int>::Fn( int in ) //builds ok
{
}

template <> void Boogy<int*>::Fn( int* in ) //builds ok
{
}

template <> void Boogy<int>::Fn2( const int& in ) //builds ok
{
}

template <> void Boogy<int*>::Fn2( const int*& in ) //DOES NOT BUILD
{
}

typedef int* intStar;
template <> void Boogy<intStar>::Fn2( const intStar& in ) //builds ok
{
}

显然,我想出了一个“黑客”来解决我的问题,但为什么黑客是必要的?我们应该这样做吗?我所在的代码库有几十个实例,其中模板类有一些成员函数的一些特化——而不是整个类。一位同事坚持认为这是不允许的。

TIA。

4

1 回答 1

5

应该是int * const &。你有T = int *,所以const T = T const = int * const

请记住,这U const &意味着“对常量的引用U”,而不是“对常量的引用U”——后者没有意义,因为 C++ 中的引用变量始终是常量,即不能重新定位。在您的情况下,U它是指向 int 的指针,而不是指向 const-int 的指针,它们是两种不同的类型。

当然,您也可以为 : 添加单独的专业化int const *

template <> void Boogy<int const *>::Fn2(int const * const & in) { /* ... */ }
于 2012-05-29T08:03:34.887 回答