簡體   English   中英

兩種模板類型之間的轉換

[英]Conversion between 2 template types

我有一個類的代碼(這是一個片段):

template<typename T>
class Pos2 {
public:
    T x, y;

    Pos2() : x(0), y(0) {};
    Pos2(T xy) : x(xy), y(xy) {};
    Pos2(T x, T y) : x(x), y(y) {};

};

現在,我還有2個typedef:

typedef Pos2<pos_scalar> Pos;
typedef Pos2<size_scalar> Size;

一切都按預期工作,但當我這樣做時:

Pos p(5.5, 6.5);
Size s(3, 8);
p = s;

我收到此錯誤:

error: conversion from ‘Size {aka Pos2<short int>}’ to non-scalar type ‘Pos’ requested

這很有道理,但我想知道如何修復它= P.

添加構造函數

template <typename Type2> Pos2(const Pos2<Type2> &other)
{ x = other.x; y = other.y; }

您需要定義一個賦值運算符,用於從類型Size到類型Pos賦值,因為它們不是同一類型,因此兩者之間沒有默認賦值運算符。

我想你想在這里使用一個模板,所以Pos2任何實例化都可以用來分配給另一個實例。 例如:

template<typename T>
class Pos2 {
public:
    T x, y;

    Pos2() : x(0), y(0) {};
    Pos2(T xy) : x(xy), y(xy) {};
    Pos2(T x, T y) : x(x), y(y) {};

    template<typename FromT>
    Pos2<T>& operator=(const Pos2<FromT>& from) {
        x = from.x;
        y = from.y;
        return *this;
    }
};

您應該對復制構造函數(此處未顯示)執行相同的操作,因為您可能希望在某個時刻在同一方案中復制構造。

這僅適用於類型TFromT之間的賦值,即pos_scalarsize_scalar 如果不是,請嘗試為賦值運算符添加正確的顯式轉換和/或模板特化。

此外,如果Pos2任何成員是私人/受保護的,您將需要與分配操作員交friend或提供足夠的getter。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM