-3

xh

class X
{
public:
    template<typename T1, typename T2>
    struct Bar
    {
    public:
        template<typename T1> void bar(T2 const& t2);
    };
}

x.cpp

如何定义函数?

4

3 回答 3

2

你有问题,T1掩盖了T1in struct Bar。您可以将其更改为T3如下所示:

class X
{
public:
    template<typename T1, typename T2>
    struct Bar
    {
    public:
        template<typename T3> void bar(T3 const& t3); // Could define it here {}
    };
}; // <-- Missing closing brace

template <typename T1, typename T2>
template <typename T3>
void X::Bar<T1, T2>::bar(T3 const& t3){} // Assuming `T3 const& t3` otherwise...

或者

template <typename T1, typename T2>
template <typename T3>
void X::Bar<T1, T2>::bar(T2 const& t2){}

然后像这样调用它:

X::Bar<int, int> b;
b.bar(1);

或者

X::Bar<int, int> b;
b.bar<int>(1);
于 2013-07-08T07:02:00.003 回答
1

这是你的想法吗?

class X
{
public:
    template<typename T1, typename T2>
    struct Bar
    {
    public:
        void bar(T2 const& t2);
    };
};


template <typename T1, typename T2> void X::Bar<T1, T2>::bar( T2 const & t2 )
{


}

请注意,我删除了template<typename T1>off ,void bar因为该资格已经是template<typename T1, typename T2> struct Bar.

编辑:如果你真的需要第三种类型来限定bar,那么考虑这个例子:

class X
{
public:
    template<typename T1, typename T2>
    struct Bar
    {
    public:
        template <typename T3>
        void bar(T1 const &t1, T2 const &t2, T3 const &t3);
    };
};


template <typename T1, typename T2>
template <typename T3>
void X::Bar<T1, T2>::bar( T1 const &t1, T2 const &t2, T3 const &t3 )
{


}
于 2013-07-08T07:00:33.870 回答
1

与任何模板一样,您需要将定义包含在任何可能隐式实例化它的翻译单元中,因此您应该将其放在头文件而不是 .cpp 文件中。如果你想在行外包含函数的定义,下面是如何编写它:

template<typename T1, typename T2> template<typename T3>
void X::Bar<T1, T2>::bar(T2 const &t2) {
  // ...
}

另外值得注意的是,您的类定义格式不正确,因为您将外部模板的参数T1与内部模板的参数遮蔽T1。您需要重命名其中之一。

于 2013-07-08T07:03:55.137 回答