C ++模板C2039

时间:2013-07-07 03:01:00

标签: c++ templates

编译:

template <class T>
class Bar {};

template<class T, class Dummy=void>
class Foo;

template<class T>
class Foo <T, typename std::enable_if<
    std::is_base_of<Bar<T>, T>::value
>::type> {
    public:
        //THIS CHANGES IN THE 2ND SNIPPET
        void test () const {
            std::cout << "test";
        }
};

class Cat : Bar<Cat> {};

int main () {
    Foo<Cat> foo;
    foo.test();
    return 0;
}

此错误:

template <class T>
class Bar {};

template<class T, class Dummy=void>
class Foo;

template<class T>
class Foo <T, typename std::enable_if<
    std::is_base_of<Bar<T>, T>::value
>::type> {
    public:
        //THIS CHANGED!
        void test () const;
};

//THIS WAS ADDED SINCE THE 1ST SNIPPET!
template<class T>
void Foo<T>::test () const {
    std::cout << "test";
} //error C2039: 'test' : is not a member of 'Foo<T>'

class Cat : Bar<Cat> {};

int main () {
    Foo<Cat> foo;
    foo.test();
    return 0;
}

我已经标出了差异。 为什么在第二个代码段中出错?如何在避免错误的同时保持声明和定义分开?

我猜它与此有关: “模板 void Foo :: test()const“

就像,这是告诉编译器方法 test()const 模板类模板类Foo,T&gt; :: value&gt; ::的方法的错误方法类型&GT;

我当然是在谷歌和StackOverflow上查了一下,但似乎每当模板弹出这个错误时,每次都有不同的原因。 (可能是因为很多事情都会导致C2039错误。)

另外,可以一个mod。或者有人帮我在这篇文章中添加 C2039 标签?它说我需要一分钟。 1500代表添加该标签。

- 漫步 - 还要注意的是,自从我使用C ++以来已经有一段时间了;因为我使用过模板,所以甚至更长。我知道这可能是一种使用模板的奇怪方式,但我可以向你保证我有正当的理由!

1 个答案:

答案 0 :(得分:1)

14.5.4.3/1(C ++ 03)中给出了部分专用类模板的类外成员声明的示例。这就是它的样子

// primary template
template<class T, int I> struct A {
  void f();
};

// class template partial specialization
template<class T> struct A<T,2> {
  void g();
};

// member of class template partial specialization
template<class T> void A<T,2>::g() { }

如您所见,您必须在类外成员定义中指定专门的参数。

在你的情况下它应该是

template<class T>
void Foo<T, typename std::enable_if<
  std::is_base_of<Bar<T>, T>::value>::type>::test () const {
    std::cout << "test";
}