在类定义之外的模板类成员函数体中,何时需要模板参数
In template class member function body outside class definition, when are template parameters required?
此代码可编译(Visual Studio 2013)。请注意,我在类定义之外的函数体中传入Set
,而不是Set<T>
,作为运算符=的参数。但我不能返回Set
,也不能让它成为Set
的成员;它必须返回CCD_ 5并且是CCD_。
省略模板参数在哪里是合法的?在类定义内部,还有什么?
这是标准的变化吗?我正在努力保持与所有现有版本的兼容性,包括98。
template <typename T>
class Set
{
public:
Set() {}
const Set& operator=(const Set& rhs);
//Shouldn't this have to be
//const Set<T>& operator= (const Set<T>& rhs); ?
};
template <typename T>
const Set<T>& Set<T>::operator= (const Set& rhs) //<-- HERE
{
Set temp; //<-- AND HERE
/* ... */
return *this;
}
int main()
{
Set<int> S, T;
T = S;
}
类名在类作用域中可用。在一个单独的成员定义中,一旦您传递了C++03返回类型规范和函数名,您就进入了类范围。因此,这在C++03:中是可以的
template< class T >
Set<T> const& Set<T>::operator=( Set const& rhs )
这在C++11:中是可以的
template< class T >
auto Set<T>::operator=( Set const& rhs) -> Set const&
这实际上与模板无关,但与访问类范围中可用的名称有关。
例如,在C++03中,您必须编写
struct S
{
struct Inner {};
Inner foo();
};
S::Inner S::foo() { return Inner(); }
而使用C++11和更高版本,您可以编写
struct S
{
struct Inner {};
auto foo() -> Inner;
};
auto S::foo() -> Inner { return {}; }
这是采用尾随返回类型语法作为单一语法约定的一个很好的理由。
无论哪一年的标准是,这在C或C++中都是不好的
void main() //! NOT VALID.
相关文章:
- 何时提供默认参数作为模板参数
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- 何时应在构造函数参数中使用 const C++?
- 常量引用函数参数的地址何时唯一?
- 变量是否会自动转换为函数所需的类型作为适当的参数
- 何时使用 vkCmd* 函数的参数?
- 为什么或何时应在调用之前将可调用函数参数强制转换为右值?
- 不能使用嵌套结构中的联合元素作为 scanf() 的参数来存储所需的值
- 模板参数包何时推断为空?
- 何时应使用模板化参数与构造参数
- 我们可以使用指针和何时使用空参数
- 如果有多个参数的语句需要是真实的
- 测量将参数传递到函数所需的时间
- 何时在 c++ 中使用参数(如果有的话)?
- AWS登录INVALIDPARAMETEREXCEPTION缺少所需参数SRP_A
- 如何检测我何时向可变参数函数传递"std::string"而不是"c_str()"
- 减少将参数传递给函数所需的字符串流操作的详细程度
- 错误 MSB4044:未为"CheckRuntimeLibrary"任务提供所需参数的值"RuntimeLibrary"
- 如何将唯一指针传递给函数中所需的特定参数
- 我能够调用一个不带在 c++ 中传递所需参数的方法.怎么来了