gpt4 book ai didi

c++ - 在类定义之外定义显式特化类的成员函数

转载 作者:可可西里 更新时间:2023-11-01 15:20:17 32 4
gpt4 key购买 nike

我看到一个我不理解的与模板相关的错误(编译器是 Visual Studio 2012)。这是代码,归结为要点:

// Templated class - generic 
template <typename T>
class Test
{
public:
void WorksFine() {} // Comiples and works as expected at runtime
void Problem();
};

// Templated class - expicit specialization for T = int.
template <>
class Test<int>
{
public:
void WorksFine() {} // Comiples and works as expected at runtime
void Problem();
};

// The definition below compiles and works fine at runtime.
template<typename T> void Test<T>::Problem() {}


// The definition below gives error C2910.
template<> void Test<int>::Problem() {printf("In Test::Problem(int instantiation)\n");}

对于 WorksFine 方法,函数定义在内部显式特化类定义中,一切正常。但是对于 Problem 方法,当我在显式专用类定义之外定义方法时,出现错误 C2910

这是为什么?错误 C2910 表示问题在于已经定义了 Test::Problem()。但它没有在类内部定义...没有函数定义只有一个声明。

根据您选择放置函数定义的位置来做某事或不做某事似乎很蹩脚,我一直认为这更多的是风格/语法决定,而不是功能/语义决定。我错过了什么吗?

最佳答案

您不需要 template<> .只写:

void Test<int>::Problem() {printf("In Test::Problem(int instantiation)\n");}

template<>自己显式实例化成员的情况下,需要成员特化的语法;当定义一个已经存在的特化的成员时,它被省略。

template<typename T> struct X { static int i; };
template<> int X<int>::i = 0; // member instantiation, uses template<>

template<typename T> struct Y { static int i; };
template<> struct Y<int> { static int i; } // template specialization
int Y<int>::i = 0; // no template<>

关于c++ - 在类定义之外定义显式特化类的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14321076/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com