C++ class 模板作为函数 return 类型
C++ class template as function return type
我正在做一个小项目来了解 C++ 模板的工作原理。
基本上,我有类似的东西:
class Base{
public:
MyOperation<Base> operate(Base x){ return MyOperation<Base>(x); } //error here
};
//...
template<class B>
class MyOperation : public Base{
public:
B b;
MyOperation(B b_){ b = b_; }
};
当我尝试编译我的程序时,出现错误(错误 C2143,在“<”之前缺少“;”)。是因为我不能将 MyOperation 作为 return 类型的函数 operate() 吗?
提前致谢。
声明模板的语法是template<class B>
(或等效的template<typename B>
)。
还有一个循环引用:Base
引用MyOperation
(return类型和operate
函数内部)。所以 MyOperation
需要在 Base
.
之前定义
但是 MyOperation
也引用了 Base
(基础 class)。
对于基础class,以及函数内部的使用,需要完整的定义。但是对于 return 类型,一个 不完整的类型 就足够了。所以 MyOperation
需要在 Base
之前预先声明,例如:
template<class B> class MyOperation;
另外,operate()
需要在class Base { ... }
之外定义(不是声明),在MyOperation
的定义之后。正确的代码是:
// pre-declaration of MyOperation
template<class B> class MyOperation;
// definition of Base class
class Base {
public:
// declaration of Base::operate member function
// MyOperation<Base> is incomplete type here
MyOperation<Base> operate(Base x);
};
// definition of MyOperation class template
template<class B>
class MyOperation : public Base{
public:
B b;
MyOperation(B b_){ b = b_; }
};
// definition ofBase::operate member function
inline MyOperation<Base> Base::operate(Base x) {
return MyOperation<Base>(x);
}
Base::operate
如果定义在头文件中,则需要内联,否则如果头文件被多个源文件包含,将有多个链接器符号。
如果它不是内联的(如果它是一个大函数更好),那么定义应该放在源文件中。
我正在做一个小项目来了解 C++ 模板的工作原理。 基本上,我有类似的东西:
class Base{
public:
MyOperation<Base> operate(Base x){ return MyOperation<Base>(x); } //error here
};
//...
template<class B>
class MyOperation : public Base{
public:
B b;
MyOperation(B b_){ b = b_; }
};
当我尝试编译我的程序时,出现错误(错误 C2143,在“<”之前缺少“;”)。是因为我不能将 MyOperation 作为 return 类型的函数 operate() 吗?
提前致谢。
声明模板的语法是template<class B>
(或等效的template<typename B>
)。
还有一个循环引用:Base
引用MyOperation
(return类型和operate
函数内部)。所以 MyOperation
需要在 Base
.
但是 MyOperation
也引用了 Base
(基础 class)。
对于基础class,以及函数内部的使用,需要完整的定义。但是对于 return 类型,一个 不完整的类型 就足够了。所以 MyOperation
需要在 Base
之前预先声明,例如:
template<class B> class MyOperation;
另外,operate()
需要在class Base { ... }
之外定义(不是声明),在MyOperation
的定义之后。正确的代码是:
// pre-declaration of MyOperation
template<class B> class MyOperation;
// definition of Base class
class Base {
public:
// declaration of Base::operate member function
// MyOperation<Base> is incomplete type here
MyOperation<Base> operate(Base x);
};
// definition of MyOperation class template
template<class B>
class MyOperation : public Base{
public:
B b;
MyOperation(B b_){ b = b_; }
};
// definition ofBase::operate member function
inline MyOperation<Base> Base::operate(Base x) {
return MyOperation<Base>(x);
}
Base::operate
如果定义在头文件中,则需要内联,否则如果头文件被多个源文件包含,将有多个链接器符号。
如果它不是内联的(如果它是一个大函数更好),那么定义应该放在源文件中。